如何在R中按值分组对data.table进行求和和计数

4

我有一个使用XML文件构建的数据框,现在我想统计并求和其值,类似于SQL中的计数和求和。

这就是数据框的样子:

   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)

有没有一种方法可以在一次操作中计算数量,或者我应该分别计算然后执行cbind?

我怎样才能达到我需要的效果呢?

谢谢。

1个回答

7

使用 list 将您想要在聚合的 data.table 中汇总的摘要列制成列表。使用内置符号 .N 来查找子集中的行数:

summaryTable <- summaryTable[
                        order(processDate, msgFileSource, msgDataSource),
                        list(sumDataSources=sum(msgNumRows), 
                             countDataSources=.N),
                        by=list(processDate, msgFileSource, msgDataSource) ]

使用list的方式也意味着您无需稍后使用setnames,因为您已经在list中命名了列。
这与实际问题无关,但是如下答案下面的评论所述,通过使用keyby而不是by可以取消上述命令中使用的额外order。最终命令如下:
summaryTable <- summaryTable[, list(sumDataSources=sum(msgNumRows), 
                                    countDataSources=.N),
                        keyby=list(processDate, msgFileSource, msgDataSource) ]

keyby 还有一个额外的好处,就是将其参数设置为结果表的键,并且此过程的副产品是这些键的排序。


2
很好。这里使用order()有什么原因吗?另外,length(.)只是.N-特殊的内置符号。 - Arun
2
Mattrition,对的。操作实际上并不依赖于顺序。因此,您可以使用keyby代替by,而不是使用order() - keyby将按分组列对数据进行排序聚合 - 这更有效,因为它在聚合数据上排序。有关更多信息,请查看这些新的HTML小品 - Arun
1
@StrayChild01,在你的第一条评论中,完全正确。在第二条评论中,我没有看到运行你的数据有任何问题。确保你正在查看正确的行。 - Arun
1
@StrayChild01,为什么会发生这种情况? - Arun
1
@StrayChild01,“.N” 和 “length(msgBumRows)” 应该会得到完全相同的结果,“.N” 是惯用方式。我会接受 Mattrition 的答案(除非你遇到了什么问题).. 或者你可以回答自己并接受它。祝好运! - Arun
显示剩余13条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接