如何对按 R 中的值分组的 data.table 求和和计数
How to sum and count on a data.table grouped by values in R
我有一个 data.frame,它是我使用 XML 文件构建的,现在我想对它的值进行计数和求和,类似于 SQL 中的计数和求和。
这是 data.frame 的样子:
msgDataSource msgFileSource processDate msgNumRows
1 source1 Quarter 2015-01-30 30
2 source1 Month 2015-01-30 15
3 source1 Month 2015-01-30 20
4 source1 Year 2015-01-30 1
5 source2 Quarter 2015-01-30 30
6 source3 Quarter 2015-01-30 15
7 source1 Year 2015-02-01 80
8 source2 Year 2015-02-01 90
9 source1 Quarter 2015-02-01 5
10 source2 Quarter 2015-03-15 9
11 source3 Quarter 2015-03-15 14
这就是我需要的
processDate msgFileSource msgDataSource sumDataSources countDataSources
1: 2015-01-30 Month source1 35 2
2: 2015-01-30 Quarter source1 30 1
3: 2015-01-30 Quarter source2 30 1
4: 2015-01-30 Quarter source3 15 1
5: 2015-01-30 Year source1 1 1
6: 2015-02-01 Quarter source1 5 1
7: 2015-02-01 Year source1 80 1
8: 2015-02-01 Year source2 90 1
9: 2015-03-15 Quarter source2 9 1
10: 2015-03-15 Quarter source3 14 1
这是我目前能够得到的:
processDate msgFileSource msgDataSource sumDataSources
1: 2015-01-30 Month source1 35
2: 2015-01-30 Quarter source1 30
3: 2015-01-30 Quarter source2 30
4: 2015-01-30 Quarter source3 15
5: 2015-01-30 Year source1 1
6: 2015-02-01 Quarter source1 5
7: 2015-02-01 Year source1 80
8: 2015-02-01 Year source2 90
9: 2015-03-15 Quarter source2 9
10: 2015-03-15 Quarter source3 14
这是我的代码:
dfFullData <- data.frame (
msgDataSource = c("source1", "source1", "source1", "source1", "source2", "source3", "source1", "source2", "source1", "source2", "source3"),
msgFileSource = c("Quarter", "Month", "Month", "Year", "Quarter", "Quarter", "Year", "Year", "Quarter", "Quarter", "Quarter"),
processDate = c("2015-01-30", "2015-01-30", "2015-01-30", "2015-01-30", "2015-01-30", "2015-01-30", "2015-02-01", "2015-02-01", "2015-02-01", "2015-03-15", "2015-03-15"),
msgNumRows = c(30, 15, 20, 1, 30, 15, 80, 90, 5, 9, 14),
stringsAsFactors=FALSE
)
summaryTable <- data.table(dfFullData)
summaryTable <- summaryTable[
order(processDate, msgFileSource, msgDataSource),
sum(msgNumRows),
by=list(processDate, msgFileSource, msgDataSource)
]
setnames(summaryTable, "V1", "sumDataSources")
print(summaryTable)
有没有办法计算一次pass的计数,还是我应该单独计数然后执行cbind?
如何实现我的需求?
谢谢。
使用 list
列出您想要在聚合 data.table
中的摘要列。使用内置符号 .N
查找子集中的行数:
summaryTable <- summaryTable[
order(processDate, msgFileSource, msgDataSource),
list(sumDataSources=sum(msgNumRows),
countDataSources=.N),
by=list(processDate, msgFileSource, msgDataSource) ]
以这种方式使用 list
也意味着您以后不需要使用 setnames
,因为您已经在 list
.[=22= 中命名了您的列]
这与实际问题无关,但是,正如该答案下面的评论所详述的那样,可以通过使用 keyby
而不是来否定在上述命令中使用额外的 order
by
。最终命令将如下所示:
summaryTable <- summaryTable[, list(sumDataSources=sum(msgNumRows),
countDataSources=.N),
keyby=list(processDate, msgFileSource, msgDataSource) ]
keyby
还具有将其参数设置为结果 table 的键的额外好处,其排序是此过程的副产品。