为了账号安全,请及时绑定邮箱和手机立即绑定

在一次调用中按组对多个变量应用多个汇总函数

在一次调用中按组对多个变量应用多个汇总函数

慕尼黑8549860 2019-06-20 17:30:04
在一次调用中按组对多个变量应用多个汇总函数我有以下数据框架x <- read.table(text = "  id1 id2 val1 val2 1   a   x    1    9 2   a   x    2    4 3   a   y    3    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)我要计算按Id1和id2分组的val1和val2的平均值,同时计算每个Id1-id2组合的行数。我可以分别执行每一项计算:# calculate meanaggregate(. ~ id1 + id2, data = x, FUN = mean)# count rowsaggregate(. ~ id1 + id2, data = x, FUN = length)为了在一次调用中进行两次计算,我尝试了do.call("rbind", aggregate(. ~ id1 + id2, data = x, FUN = function(x) data.frame(m = mean(x), n = length(x))))但是,我得到了一个错误的输出以及一个警告:#     m   n# id1 1   2# id2 1   1#     1.5 2#     2   2#     3.5 2#     3   2#     6.5 2#     8   2#     7   2#      6   2# Warning message:#   In rbind(id1 = c(1L, 2L, 1L, 2L), id2 = c(1L, 1L, 2L, 2L), val1 = list( :#      number of columns of result is not a multiple of vector length (arg 1)我可以使用plyr包,但是当数据集的大小增加时,我的数据集非常大,而且plyr非常慢(几乎无法使用)。我怎么用aggregate还是其他函数在一次调用中执行多个计算?
查看完整描述

3 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

鉴于这一点,在问题中:


我可以使用plyr包,但是当数据集的大小增加时,我的数据集非常大,而且plyr非常慢(几乎无法使用)。


然后进去data.table (1.9.4+)你可以尝试:


> DT

   id1 id2 val1 val2

1:   a   x    1    9

2:   a   x    2    4

3:   a   y    3    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


> DT[ , .(mean(val1), mean(val2), .N), by = .(id1, id2)]   # simplest

   id1 id2  V1  V2 N

1:   a   x 1.5 6.5 2

2:   a   y 3.5 7.0 2

3:   b   x 2.0 8.0 2

4:   b   y 3.0 6.0 2


> DT[ , .(val1.m = mean(val1), val2.m = mean(val2), count = .N), by = .(id1, id2)]  # named

   id1 id2 val1.m val2.m count

1:   a   x    1.5    6.5     2

2:   a   y    3.5    7.0     2

3:   b   x    2.0    8.0     2

4:   b   y    3.0    6.0     2


> DT[ , c(lapply(.SD, mean), count = .N), by = .(id1, id2)]   # mean over all columns

   id1 id2 val1 val2 count

1:   a   x  1.5  6.5     2

2:   a   y  3.5  7.0     2

3:   b   x  2.0  8.0     2

4:   b   y  3.0  6.0     2

时间比较aggregate(使用于有关问题及所有其他3项答案)data.table看见这个基准()agg和agg.x案件)。


查看完整回答
反对 回复 2019-06-20
?
回首忆惘然

TA贡献1847条经验 获得超11个赞


您可以添加一个count列,用sum,然后缩小以获得mean:


x$count <- 1

agg <- aggregate(. ~ id1 + id2, data = x,FUN = sum)

agg

#   id1 id2 val1 val2 count

# 1   a   x    3   13     2

# 2   b   x    4   16     2

# 3   a   y    7   14     2

# 4   b   y    6   12     2


agg[c("val1", "val2")] <- agg[c("val1", "val2")] / agg$count

agg

#   id1 id2 val1 val2 count

# 1   a   x  1.5  6.5     2

# 2   b   x  2.0  8.0     2

# 3   a   y  3.5  7.0     2

# 4   b   y  3.0  6.0     2

它的优点是保留列名并创建一个count列。


查看完整回答
反对 回复 2019-06-20
  • 3 回答
  • 0 关注
  • 555 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信