如何对按 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 的键的额外好处,其排序是此过程的副产品。