如何对R中按值分组的data.table进行求和和计数
我有一个使用XML文件构建的data.frame,现在我想对它的值进行计数和求和,类似于SQL中的计数和求和 下面是data.frame的外观:如何对R中按值分组的data.table进行求和和计数,r,data.table,R,Data.table,我有一个使用XML文件构建的data.frame,现在我想对它的值进行计数和求和,类似于SQL中的计数和求和 下面是data.frame的外观: msgDataSource msgFileSource processDate msgNumRows 1 source1 Quarter 2015-01-30 30 2 source1 Month 2015-01-30 15 3 source
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)
dfFullData使用list
在聚合的数据表中列出所需的摘要列。使用内置符号.N
查找子集中的行数:
summaryTable <- summaryTable[
order(processDate, msgFileSource, msgDataSource),
list(sumDataSources=sum(msgNumRows),
countDataSources=.N),
by=list(processDate, msgFileSource, msgDataSource) ]
keyby
还有另外一个好处,就是将其参数设置为结果表的键,该表的顺序是此过程的副产品。Nice。有什么理由在这里下订单吗?另外,length(.)
只是.N
-一种特殊的内置符号。操作实际上并不取决于顺序。因此,您可以使用keyby
代替by
,而不是使用order()
-keyby
将在聚合后通过对列进行分组对数据进行排序,这比对聚合数据进行排序更有效。查看更多信息。@StrayChild01,在您的第一条评论中,完全正确。在2号,我没有看到任何错误运行您的数据。确保您看到的是正确的一行。@StrayChild01,为什么会发生什么事?@StrayChild01,我无法重现这个问题。如果你能提供代码和数据,我很乐意看一看,看看有什么问题。
summaryTable <- summaryTable[, list(sumDataSources=sum(msgNumRows),
countDataSources=.N),
keyby=list(processDate, msgFileSource, msgDataSource) ]