【问题标题】:Using tapply on data with NAs在带有 NA 的数据上使用 tapply
【发布时间】:2015-02-19 02:13:31
【问题描述】:

我有一个包含一些 NA 的数据列 (Percent.Plant.Parasites)。我想取按因子“Stage”排序的数据的平均值(即stage1 Mean=x,stage2 Mean=y等)。我尝试使用

tapply(rawdata$Percent.Plant.Parasites, rawdata$Stage, mean)

但是,我得到了 NA,因为数据中有 NA。我不相信 tapply 有一个 na.rm 选项(有吗?),所以我尝试使用以下方法计算每个单独阶段因子的平均值:

mean(subset(rawdata,subset=Stage=="stage1")$Percent.Plant.Parasites, na.rm=TRUE)

无济于事。相反,我得到了错误:

In mean.default(subset(rawdata, subset = Stage == "Kax")$Percent.Plant.Parasites,  :

参数不是数字或逻辑:返回 NA

但是,当我这样做时:

typeof(subset(rawdata,subset=Stage=="Kax")$Percent.Plant.Parasites)

我收到integer

任何想法我哪里出错了?

谢谢。

【问题讨论】:

  • 试试mean(subset(rawdata, Stage=="stage1")$Percent.Plant.Parasites, na.rm=TRUE)
  • tapply的结构为:tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE)。您可以尝试在... 参数中指定na.rm = TRUE,如下所示:tapply(rawdata$Percent.Plant.Parasites, rawdata$Stage, mean, na.rm = TRUE)
  • 什么是class(rawdata$Percent.Plant.Parasites)?我打赌这是“因素”,在这种情况下,您可能需要致电rawdata$Percent.Plant.Parasites <- as.numeric(as.character(Percent.Plant.Parasites))
  • 谢谢大家。我最终使用 ddply 解决了这个问题并总结。

标签: r


【解决方案1】:

为什么不直接创建一个新函数,称为 mean_NA,它只是在计算平均值之前删除 NA,然后在 tapply 中使用该函数?类似的东西:

mean_NA<-function(v){
    avg<-mean(v, na.rm = T)
return (avg)
}

如前所述,请确保您取平均值的数据是数字/整数,INDEX 是因子(组)。您可以像这样使用新创建的函数:

tapply(X = rawdata$Percent.Plant.Parasites, INDEX = rawdata$Stage, mean_NA)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多