2013-01-05 27 views
8

Chciałbym obliczyć średnią i sd z ramki danych z jedną kolumną dla parametru i jedną kolumną dla identyfikatora grupy. Jak mogę je obliczyć, korzystając z tapply? Mogę użyć sd(v1, group, na.rm=TRUE), ale nie mogę dopasować na.rm=TRUE do instrukcji, gdy używam tapply. omit.na to żadna opcja. Mam cały szereg parametrów i muszę przejść przez nie krok po kroku, nie tracąc połowy ramki danych po wykluczeniu wszystkich linii z jedną brakującą wartością.Jak przekazać na.rm jako argument do tapply?

data("weightgain", package = "HSAUR") 
tapply(weightgain$weightgain, list(weightgain$source, weightgain$type), mean) 

To samo dotyczy oświadczenia by.

x<-c(1,2,3,4,5,6,7,8,9,NA) 
y<-c(2,3,NA,3,4,NA,2,3,NA,2) 
group<-rep((factor(LETTERS[1:2])),5) 
df<-data.frame(x,y,group) 
df 

by(df$x,df$group,summary) 
by(df$x,df$group,mean) 

sd(df$x) #result: NA 
sd(df$x, na.rm=TRUE) #result: 2.738613 

Jakieś pomysły, jak to zrobić?

+0

Dość dużo! Czy mogę zastosować to do kilku kolumn tabeli lub czy będę musiał przechodzić przez listę parametrów? 'tapply (df [c (" x "," y ")], df $ group, sd, na.rm = TRUE)' czy tak? – Doc

+2

Pytanie nie ma sensu. Za pomocą 'help (tapply)' powinieneś zobaczyć, że istnieje argument '...', który jest opisany jako oferujący obietnicę, że nazwane elementy zostaną przekazane do funkcji FUN. Jaki błąd pojawił się, gdy użyłeś kodu: 'tapply (df $ V1, df $ grupa, sd, na.rm = TRUE)' –

Odpowiedz

5

Myślę, że powinno to zrobić, co chcesz.

  1. Wybierz kolumny chcesz:

    v = c("x", "y")#or 
    v = colnames(df)[1:2] 
    
  2. Zastosowanie sapply iteracyjne nad v i przekazać wartości do tapply:

    sapply(v, function(i) tapply(df[[i]], df$group, sd, na.rm=TRUE)) 
    
13

Wystarczy ustawić na.rm=TRUE w tapply funkcja:

tapply(weightgain$weightgain, list(weightgain$source, weightgain$type), mean, na.rm=TRUE) 
+0

To powinna być zaakceptowana odpowiedź. – Ben

+0

Zgadzam się. Przyjęta odpowiedź wydaje się bardziej zawiła, a ta zadziałała jak urok. –

Powiązane problemy