我有以下数据框:
x <- read.table(text = " id1 id2 var1 var2
1 a x 1 NA
2 a x 2 4
3 a y 2 5
4 a y 4 9
5 b x 1 7
6 b y 4 4
7 b x 3 9
8 b y 2 8", header = TRUE)
在第一行中包含一个NA
值。我使用aggregate()
函数在一个调用中对几个变量应用了几个函数:
aggregate(cbind(var1, var2) ~ id1 + id2, data = x,
FUN = function(x) c(mn = mean(x), n = length(x)))
这导致以下输出:
id1 id2 var1.mn var1.n var2.mn var2.n
1 a x 2 1 4 1
2 b x 2 2 8 2
3 a y 3 2 7 2
4 b y 3 2 6 2
不幸的是,对于每个变量(也是var1 ),将删除var2中包含NA
值的完整行。
在一次调用中对多个变量使用aggregate()
函数而不会丢失包含NA
值的所有行的任何解决方案?
我的首选输出应如下所示:
id1 id2 var1.mn var1.n var2.mn var2.n
1 a x 1.5 2 4 1
2 b x 2.0 2 8 2
3 a y 3.0 2 7 2
4 b y 3.0 2 6 2
答案 0 :(得分:1)
aggregate(x[c("var1", "var2")], x[c("id1", "id2")],
function(x) c(mn = mean(x, na.rm = TRUE), n = sum(!is.na(x))))
# id1 id2 var1.mn var1.n var2.mn var2.n
#1 a x 1.5 2.0 4 1
#2 b x 2.0 2.0 8 2
#3 a y 3.0 2.0 7 2
#4 b y 3.0 2.0 6 2