我有以下数据框

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 mean
aggregate(. ~ id1 + id2, data = x, FUN = mean)

# count rows
aggregate(. ~ id1 + id2, data = x, FUN = length)

为了在一次通话中完成这两项计算,我try 了

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或其他函数在一次调用中执行多个计算?

推荐答案

您可以在一个步骤中完成这一切,并获得适当的标签:

> aggregate(. ~ id1+id2, data = x, FUN = function(x) c(mn = mean(x), n = length(x) ) )
#   id1 id2 val1.mn val1.n val2.mn val2.n
# 1   a   x     1.5    2.0     6.5    2.0
# 2   b   x     2.0    2.0     8.0    2.0
# 3   a   y     3.5    2.0     7.0    2.0
# 4   b   y     3.0    2.0     6.0    2.0

这将创建一个包含两个id列和两个矩数组的数据框:

str( aggregate(. ~ id1+id2, data = x, FUN = function(x) c(mn = mean(x), n = length(x) ) ) )
'data.frame':   4 obs. of  4 variables:
 $ id1 : Factor w/ 2 levels "a","b": 1 2 1 2
 $ id2 : Factor w/ 2 levels "x","y": 1 1 2 2
 $ val1: num [1:4, 1:2] 1.5 2 3.5 3 2 2 2 2
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr  "mn" "n"
 $ val2: num [1:4, 1:2] 6.5 8 7 6 2 2 2 2
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr  "mn" "n"

正如@lord所指出的.在下面的垃圾中,可以使用do.call(data.frame, ...)将其转换为具有"简单"列的数据帧

str( do.call(data.frame, aggregate(. ~ id1+id2, data = x, FUN = function(x) c(mn = mean(x), n = length(x) ) ) ) 
    )
'data.frame':   4 obs. of  6 variables:
 $ id1    : Factor w/ 2 levels "a","b": 1 2 1 2
 $ id2    : Factor w/ 2 levels "x","y": 1 1 2 2
 $ val1.mn: num  1.5 2 3.5 3
 $ val1.n : num  2 2 2 2
 $ val2.mn: num  6.5 8 7 6
 $ val2.n : num  2 2 2 2

这是LHS上多个变量的语法:

aggregate(cbind(val1, val2) ~ id1 + id2, data = x, FUN = function(x) c(mn = mean(x), n = length(x) ) )

R相关问答推荐

从cv.glmnet R包中查找培训SSE

使用long()在dØr中过滤后获取元素数量

rvest函数read_html_live()不允许html_elements()正确读取

从载体创建 pyramid

使用格式化程序自定义hc_tooltip以添加textColor删除了我的标记并try 将它们带回失败

为什么以及如何修复Mapview不显示所有点并且st_buffer合并一些区域R?

在通过最大似然估计将ODE模型与数据匹配时,为什么要匹配实际参数的转换值?

在ggplot Likert条中添加水平线

任意列的欧几里得距离

将向量组合到一个数据集中,并相应地命名行

二维样条,严格以一个参数递增

如何在R中对深度嵌套的tibbles中的非空连续行求和?

如何计算多个日期是否在一个日期范围内

将数字转换为分钟和秒

一小时满足条件的日期的 Select

如何在R forestplot中为多条垂直线分配唯一的 colored颜色 ?

2个Rscript.exe可执行文件有什么区别?

为什么我使用geom_density的绘图不能到达x轴?

手动指定从相同数据创建的叠加图的 colored颜色

使用ggplot2绘制具有边缘分布的坡度图