使用聚合的 na.omit 和 na.pass 的混合?

Posted

技术标签:

【中文标题】使用聚合的 na.omit 和 na.pass 的混合?【英文标题】:Blend of na.omit and na.pass using aggregate? 【发布时间】:2013-07-18 05:06:35 【问题描述】:

我有一个包含产品原型测试数据的数据集。并非所有测试都在所有批次上运行,并且并非所有测试都使用相同的样本量执行。为了说明,请考虑以下情况:

> test <- data.frame(name = rep(c("A", "B", "C"), each = 4),
  var1 = rep(c(1:3, NA), 3),
  var2 = 1:12,
  var3 = c(rep(NA, 4), 1:8))

> test
   name var1 var2 var3
1     A    1    1   NA
2     A    2    2   NA
3     A    3    3   NA
4     A   NA    4   NA
5     B    1    5    1
6     B    2    6    2
7     B    3    7    3
8     B   NA    8    4
9     C    1    9    5
10    C    2   10    6
11    C    3   11    7
12    C   NA   12    8

在过去,我只需要处理不匹配重复的情况,使用aggregate(cbind(var1, var2) ~ name, test, FUN = mean, na.action = na.omit)(或默认设置)很容易。对于var1 的三个值和var2 的四个值,我将获得每个批次的平均值。

不幸的是,在这种情况下,这将使我的数据集完全丢失很多 A

 aggregate(cbind(var1, var2, var3) ~ name, test, FUN = mean, na.action = na.omit)
  name var1 var2 var3
1    B    2    6    2
2    C    2   10    6

但是,如果我使用na.pass,我也得不到我想要的:

 aggregate(cbind(var1, var2, var3) ~ name, test, FUN = mean, na.action = na.pass)
  name var1 var2 var3
1    A   NA  2.5   NA
2    B   NA  6.5  2.5
3    C   NA 10.5  6.5

现在我丢失了我在 var1 中的良好数据,因为它包含 NA 的实例。

我想要的是:

NA 作为mean() 的输出,如果所有 varN ~ name 的唯一组合是NAs 如果varN 有一个或多个实际值,则输出mean() ~ name

我猜这很简单,但我不知道怎么做。我需要使用ddply 来处理这样的事情吗?如果是这样......我倾向于避免它的原因是我最终会写出与aggregate() 相当长的等价物,如下所示:

ddply(test, .(name), summarise,
  var1 = mean(var1, na.rm = T),
  var2 = mean(var2, na.rm = T),
  var3 = mean(var3, na.rm = T))

是的...所以结果显然符合我的要求。无论如何我都会留下这个问题,以防有 1) 一种使用 aggregate() 的方法或 2) ddply 的更短语法。

【问题讨论】:

重新偶然发现了一个答案。 ddplyHERE。基本上,融化数据框,根据感兴趣的变量和前列名称的组合应用mean(),然后将其转换回原始形状。还有其他人吗? 【参考方案1】:

na.action=na.passna.rm=TRUE 两者 传递给aggregate。前者告诉aggregate 不要删除存在 NA 的行;后者告诉mean 忽略它们。

aggregate(cbind(var1, var2, var3) ~ name, test, mean,
          na.action=na.pass, na.rm=TRUE)

【讨论】:

太棒了,我不知道这是可能的。 @HongOoi 这很好用。需要注意的是,这将根据您选择的功能将 NA 替换为零。这很可能不是您想要的最终结果,因此请务必跟进df[df == 0] &lt;- NA 之类的内容。如果您的 df 中有不想删除的实零,则将上面的代码与 is.na(df) 结合使用 提示此返回 NaN,而不是 NA 名称 A, var3

以上是关于使用聚合的 na.omit 和 na.pass 的混合?的主要内容,如果未能解决你的问题,请参考以下文章

R语言使用isna函数查看列表和dataframe中是否包含缺失值将dataframe中数据列中的异常值标注为缺失值NA使用na.omit函数删除dataframe中包含缺失值NA的数据行

R dplyr,将 mutate 与 na.omit 一起使用会导致错误大小不兼容 (%d)

R语言 -- if 不能识别含有NA的数据

在 ggplot 中使用 NA 值创建连续折线图并添加辅助 y 轴

如何用 R 平均两个(或多个直方图)

R语言移除缺失值 NA