如何将na.rm作为参数传递给tapply?

Doc*_*Doc 11 r tapply na.rm

我想从一个数据帧计算mean和sd,参数为一列,组标识为一列.使用时如何计算tapply?我可以使用sd(v1, group, na.rm=TRUE),但na.rm=TRUE在使用时不适合语句tapply. omit.na别无选择.我有一大堆参数,在排除所有缺少值的行时,必须逐步完成它们而不会丢失一半的数据帧.

data("weightgain", package = "HSAUR")
tapply(weightgain$weightgain, list(weightgain$source, weightgain$type), mean)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

有任何想法如何完成这项工作?

小智 20

只需设置na.rm=TRUEtapply功能:

tapply(weightgain$weightgain, list(weightgain$source, weightgain$type), mean, na.rm=TRUE)
Run Code Online (Sandbox Code Playgroud)

  • 我同意。公认的答案似乎更令人费解,并且这个答案就像一个咒语。 (2认同)

csg*_*pie 5

我认为这应该做你想要的.

  1. 选择所需的列:

    v = c("x", "y")#or
    v = colnames(df)[1:2]
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用sapply遍历v和值传递给tapply:

    sapply(v, function(i) tapply(df[[i]], df$group, sd, na.rm=TRUE))
    
    Run Code Online (Sandbox Code Playgroud)