[英]dplyr: colSums on sub-grouped (group_by) data frames: elegantly
我有一个非常大的数据框(265,874 x 30),包含三个合理的组:年龄类别(1-6)、日期(5479 个)和地理区域(共 4 个)。 每条记录都包含一个选项,外加 27 个计数变量。 我想按每个分组变量进行分组,然后对结果子分组的 27 个变量进行 colSums。 我一直在尝试使用dplyr (v0.2) 来做这件事,因为手动执行它最终会设置很多冗余的东西(或者诉诸循环来遍历分组选项,因为缺乏优雅的解决方案) .
示例代码:
countData <- sample(0:10, 2000, replace = TRUE)
dates <- sample(seq(as.Date("2010/1/1"), as.Date("2010/01/30"), "days"), 200, replace = TRUE)
locality <- sample(1:2, 2000, replace = TRUE)
ageCat <- sample(1:2, 2000, replace = TRUE)
sampleDF <- data.frame(dates, locality, ageCat, matrix(countData, nrow = 200, ncol = 10))
那么我想做的是......
library("dplyr")
sampleDF %.% group_by(locality, ageCat, dates) %.% do(colSums(.[, -(1:3)]))
但这并不完全有效,因为 colSums() 的结果不是数据框。 如果我投它,它的工作原理:
sampleDF %.% group_by(locality, ageCat, dates) %.% do(data.frame(matrix(colSums(.[, -(1:3)]), nrow = 1, ncol = 10)))
但最后的 do(...) 位似乎很笨重。
关于如何更优雅或更有效地做到这一点的任何想法? 我想问题归结为:如何最好地使用 do() 函数和 . 运算符通过 colSums 汇总数据帧。
注意:do(.) 运算符仅适用于dplyr 0.2,因此您需要从 GitHub(链接)而不是从 CRAN 获取它。
编辑:建议的结果
三种解决方案:
我在帖子中的建议:经过,146.765 秒。
@joran 的建议如下:6.902 秒
@eddi 在评论中的建议,使用 data.table:6.715 秒。
我没有费心去复制,只是使用 system.time() 来获得一个粗略的衡量标准。 从它的外观来看, dplyr和data.table在我的数据集上的表现大致相同,而且在正确使用时,两者都比我昨天提出的 hack 解决方案快得多。
除非我失去了一些东西,这似乎是一个工作summarise_each
(几分colwise
从plyr模拟):
sampleDF %.% group_by(locality, ageCat, dates) %.% summarise_each(funs(sum))
默认情况下,分组列不包含在汇总功能中,您只能选择列的子集以使用与使用select
时相同的技术来应用这些功能。
( summarise_each
是dplyr的0.2版本,但没有在0.1.3,据我所知)。
这是@joran在2014年的精彩回答。
现在这个方法已被弃用。 相反,请使用summarize_all()
或summarize_at()
。
这是@Hack-R 在 2018 年的精彩回答。
现在这种方法已被取代。 相反,请使用summarize()
/ summarise()
结合across()
。 ;-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.