使用聚合aggregate的 na.omit 和 na.pass 的混合的错误问题—解决思路

问题描述:

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

> 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()如果~的所有唯一组合都是s的输出varNnameNA

  • mean()是否有一个或多个实际值的输出varN~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))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.

解决思路一:

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

解决思路二:

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

以上仅为部分解决思路介绍,查看全部内容,请添加公众号后回复001,即可查看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快撑死的鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值