web-dev-qa-db-ja.com

tapplyの引数としてna.rmを渡す方法は?

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

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

これを行う方法について何かアイデアはありますか?

11
Doc

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

  1. 必要な列を選択します。

    v = c("x", "y")#or
    v = colnames(df)[1:2]
    
  2. sapplyを使用してvを反復処理し、値をtapplyに渡します。

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

tapply関数でna.rm=TRUEを設定するだけです。

tapply(weightgain$weightgain, list(weightgain$source, weightgain$type), mean, na.rm=TRUE)
21
user4196706