【问题标题】:How to pass na.rm as argument to tapply?如何将 na.rm 作为参数传递给 tapply?
【发布时间】:2012-12-19 19:14:03
【问题描述】:

我想从一个数据框中计算平均值和标准差,其中一列用于参数,一列用于组标识符。使用tapply 时如何计算它们?我可以使用sd(v1, group, na.rm=TRUE),但在使用tapply 时不能将na.rm=TRUE 放入语句中。 omit.na 是没有选择的。我有一大堆参数,当排除所有具有一个缺失值的行时,必须逐步完成它们而不会丢失一半的数据帧。

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

有什么办法可以完成这项工作吗?

【问题讨论】:

  • 差不多!我可以将它应用于表格的几个列还是必须循环遍历参数列表? tapply(df[c("x","y")], df$group, sd, na.rm=TRUE) 左右?
  • 这个问题没有意义。使用help(tapply),您应该看到有一个... 参数被描述为提供了一个承诺,即命名项目将被传递给FUN 函数。使用代码时遇到了什么错误:tapply(df$V1, df$group, sd, na.rm=TRUE)

标签: r tapply na.rm


【解决方案1】:

只需在tapply函数中设置na.rm=TRUE

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

【讨论】:

  • 我同意。接受的答案似乎更令人费解,而这个答案就像一个魅力。
【解决方案2】:

我认为这应该可以满足您的需求。

  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))
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 2013-01-27
    • 2010-09-17
    • 1970-01-01
    相关资源
    最近更新 更多