用聚合物混合na.omit和na.pass?

Hen*_*ndy 6 aggregate r summary plyr

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

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

在过去,我只需要处理错误匹配重复的情况,这很容易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
Run Code Online (Sandbox Code Playgroud)

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

现在我丢失了我所拥有的好数据,var1因为它包含了实例NA.

我想要的是:

  • NA作为输出mean(),如果所有的独特组合varNnameNA小号
  • 输出mean()如果有一个或多个实际值varNname

我猜这很简单,但我不知道怎么做.我是否需要使用这样ddply的东西?如果是这样的话......我倾向于避免这种情况的原因是我最终会写出相当长的等价物aggregate():

ddply(test, .(name), summarise,
  var1 = mean(var1, na.rm = T),
  var2 = mean(var2, na.rm = T),
  var3 = mean(var3, na.rm = T))
Run Code Online (Sandbox Code Playgroud)

是的......所以结果显然是我想要的.无论如何,我会留下这个问题,以防有一种方法可以做到这一点,aggregate()或者2)更短的语法ddply.

Hon*_*Ooi 17

通过这两个 na.action=na.passna.rm=TRUEaggregate.前者告诉aggregate不要删除存在NAs的行; 后者告诉mean他们忽略它们.

aggregate(cbind(var1, var2, var3) ~ name, test, mean,
          na.action=na.pass, na.rm=TRUE)
Run Code Online (Sandbox Code Playgroud)