2011-01-29 4 views
8

Chcę użyć R do podsumowania danych liczbowych w tabeli z nieunikalnymi rownames do tabeli wyników z unikalnymi nazwami wierszy z wartościami podsumowanymi za pomocą niestandardowej funkcji . Logika podsumowania jest następująca: użyj średniej wartości, jeśli stosunek wartości maksymalnej do minimalnej wynosi < 1.5, w przeciwnym razie użyj mediany. Ponieważ tabela jest bardzo duża, próbuję użyć funkcji stop() i funkcji rzutowania (cast) w pakiecie reshape2.Błąd z niestandardową funkcją agregującą dla wywołania cast() w R reshape2

# example table with non-unique row-names 
tab <- data.frame(gene=rep(letters[1:3], each=3), s1=runif(9), s2=runif(9)) 
# melt 
tab.melt <- melt(tab, id=1) 
# function to summarize with logic: mean if max/min < 1.5, else median 
summarize <- function(x){ifelse(max(x)/min(x)<1.5, mean(x), median(x))} 
# cast with summarized values 
dcast(tab.melt, gene~variable, summarize)

Ostatni wiersz powyższego kodu powoduje wyświetlenie komunikatu o błędzie.

Error in vapply(indices, fun, .default) : 
    values must be type 'logical', 
but FUN(X[[1]]) result is type 'double' 
In addition: Warning messages: 
1: In max(x) : no non-missing arguments to max; returning -Inf 
2: In min(x) : no non-missing arguments to min; returning Inf 

Co robię źle? Zauważ, że jeśli funkcja podsumowania miała po prostu zwrócić min() lub max(), nie ma błędu, mimo że pojawia się komunikat ostrzegawczy "brak brakujących argumentów". Dziękuję za wszelkie sugestie.

(Rzeczywista stół Chcę pracować to 200x10000 jeden).

Odpowiedz

2

dcast() próbuje ustawić wartość brakuje kombinację według wartości domyślnej.

możesz określić ten argument przez wypełnienie, ale jeśli wypełnienie = NULL, , wówczas wartość zwrócona przez fun (wektor o długości 0) (tj. Podsumowania (numeryczne (0)) tutaj) jest używana jako domyślna. ?

proszę zobaczyć dcast

wtedy, tutaj jest obejście:

dcast(tab.melt, gene~variable, summarize, fill=NaN) 
+0

Dziękuję za uwagę i pomoc. – user594694

9

Krótka odpowiedź: podać wartość wypełnienia następująco acast (tab.melt, gen ~ zmienna, podsumować wypełnić = 0)

Długa odpowiedź: wydaje czynność zostaje owinięty jak następuje, zanim zostaną przekazane do vapply w funkcji vaggregate (dcast połączeń oddanych który wzywa vaggregate który nazywa vapply):

fun <- function(i) { 
    if (length(i) == 0) 
     return(.default) 
    .fun(.value[i], ...) 
} 

Aby dowiedzieć się, jakie powinny być .DEFAULT ten kod jest wykonywany

if (is.null(.default)) { 
    .default <- .fun(.value[0]) 
} 

tj .value [0] jest przekazywana do funkcji. min (x) lub max (x) zwraca wartość Inf lub -Inf, gdy x jest wartością numeryczną (0). Jednak max (x)/min (x) zwraca NaN, który ma klasę logiczną. kiedy vapply więc jest wykonywany

vapply(indices, fun, .default) 

z domyślną wartością jest bycie klasy logicznej (używany jako szablon vapply), funkcja zawodzi podczas uruchamiania, aby powrócić podwaja.

+0

Świetne wyjaśnienie! – hadley

+0

Dziękuję za sugestię i wyjaśnienie. Po podaniu wartości "wypełnij" w wywołaniu dcast(), udało mi się uruchomić kod. – user594694

Powiązane problemy