2013-01-05 10 views
8

Ich möchte Mittelwert und SD aus einem Datenrahmen mit einer Spalte für den Parameter und einer Spalte für eine Gruppenkennung berechnen. Wie kann ich sie berechnen, wenn Sie tapply verwenden? Ich könnte sd(v1, group, na.rm=TRUE) verwenden, kann aber nicht die na.rm=TRUE in die Anweisung einfügen, wenn Sie tapply verwenden. omit.na ist keine Option. Ich habe eine ganze Reihe von Parametern und muss diese Schritt für Schritt durchgehen, ohne die Hälfte des Datenrahmens zu verlieren, wenn alle Zeilen mit einem fehlenden Wert ausgeschlossen werden.Wie man na.rm als Argument an tapply übergeben?

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

Das gleiche gilt für die by Aussage wahr.

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 

Irgendwelche Ideen, wie man das schafft?

+0

Ziemlich viel! Kann ich das auf mehrere Spalten der Tabelle anwenden oder muss ich eine Parameterliste durchlaufen? 'tapply (df [c (" x "," y ")], df $ gruppe, sd, na.rm = TRUE) oder so? – Doc

+2

Die Frage ergibt keinen Sinn. Mit 'help (tapply)' sollten Sie sehen, dass es ein '...' Argument gibt, das als Versprechen beschrieben wird, dass benannte Elemente an die FUN-Funktion übergeben werden. Welchen Fehler haben Sie bekommen, wenn Sie den Code benutzt haben: 'tapply (df $ V1, df $ group, sd, na.rm = TRUE)' –

Antwort

5

Ich denke, das sollte tun, was Sie wollen.

  1. die Spalten wählen Sie:

    v = c("x", "y")#or 
    v = colnames(df)[1:2] 
    
  2. Verwenden sapply über v laufen und die Werte zu tapply passieren:

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

Einfach gesetzt na.rm=TRUE im tapply Funktion:

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

Dies sollte die akzeptierte Antwort sein. – Ben

+0

stimme ich zu. Die angenommene Antwort scheint komplizierter, und diese funktionierte wie ein Zauber. –

Verwandte Themen