我有一个非常大的数据框(265,874 x 30),有三个明智的组:年龄类别(1-6),日期(5479这样)和地理位置(总共4个) . 每条记录包括每个记录中的一个选项,以及27个计数变量 . 我想按每个分组变量进行分组,然后对得到的子分组27变量进行colSums . 我一直在尝试使用 dplyr (v0.2)来做这件事,因为手动完成它会最终设置很多冗余的东西(或者通过循环来迭代分组选项,因为缺乏优雅的解决方案) .
Example code :
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()函数和 . 运算符通过colSums汇总数据框 .
注意:do( . )运算符仅适用于 dplyr 0.2,因此您需要从GitHub(link)中获取它,而不是从CRAN中获取它 .
编辑:建议的结果
Three solutions :
-
我在帖子中的建议:已过去,146.765秒 .
-
@joran的建议如下:6.902秒
-
@ eddi在评论中的建议,使用data.table:6.715秒 .
我没有费心去复制,只是使用system.time()来获得粗略的衡量标准 . 从它的外观来看, dplyr 和 data.table 在我的数据集上执行大致相同,并且两者在正确使用时比我昨天提出的黑客解决方案快得多 .
2 回答
除非我遗漏了某些东西,否则这似乎是
summarise_each
(colwise
的一种colwise
类似物)的作业:默认情况下,分组列不包含在汇总功能中,您只能选择列的子集以使用与使用
select
时相同的技术来应用这些功能 .(据我所知,
summarise_each
在 dplyr 的0.2版本中,但在0.1.3中没有 . )这是@joran在2014年的精彩回答 .
现在这个方法已被弃用 . 相反,请使用
summarize_all()
或summarize_at()
.