我有一个包含产品原型测试数据的数据集。并非所有测试都在所有批次上运行,并且并非所有测试都使用相同的样本量执行。为了说明,考虑这种情况:
> 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的输出varN
name
NA
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))
是的......所以结果显然符合我的要求。无论如何我都会留下这个问题,以防有 1) 一种方法可以做到这一点,aggregate()
或者 2) 更短的ddply
.