2013-01-05 4 views
8

私は、データフレームから平均とsdを計算するのは、そのパラメータのための1つの列とグループ識別子のための1つの列です。 tapplyを使用しているときにそれらを計算するにはどうすればよいですか?私はsd(v1, group, na.rm=TRUE)を使用することができますが、tapplyを使用する場合、na.rm=TRUEをこのステートメントに適合させることはできません。 omit.naはオプションではありません。私はパラメータのすべてを持っており、1つの値が欠けているすべての行を除外すると、データフレームの半分を失うことなく、段階的に進めなければなりません。tapplyに引数としてna.rmを渡すには?

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

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 

これを行う方法はありますか。

+0

かなり!テーブルのいくつかの欄にそれを適用できますか?それとも、パラメータリストをループする必要がありますか? 'tapply(df [c(" x "、" y ")]、df $ group、sd、na.rm = TRUE)'そうですか? – Doc

+2

質問は理にかなっていません。 'help(tapply)'では、名前付き項目がFUN関数に渡されるという約束を提供するものとして記述される '...'引数があることがわかります。 'tapply(df $ V1、df $ group、sd、na.rm = TRUE)' –

答えて

5

私はこれがあなたが望むことをするべきだと思います。

  1. したい列を選択します。vを反復してtapplyに値を渡すために

    v = c("x", "y")#or 
    v = colnames(df)[1:2] 
    
  2. 使用sapplyを:

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

単にtapplyna.rm=TRUEを設定関数:

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

これは受け入れられた答えでなければなりません。 – Ben

+0

私は同意します。受け入れられた答えは、より複雑に思われ、この1つは魅力のように働いた。 –

関連する問題