gpt4 book ai didi

r - 如何对按 R 中的值分组的 data.table 求和和计数

转载 作者:行者123 更新时间:2023-12-04 12:07:43 27 4
gpt4 key购买 nike

我有一个使用 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 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?

我如何实现我所需要的?

谢谢。

最佳答案

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

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

使用 list这种方式也意味着你不需要使用 setnames稍后,因为您已经在 list 中命名了您的列。 .

这与实际问题无关,但正如此答案下面的评论所详述的,使用额外的 order在上面的命令中可以使用 keyby 来否定而不是 by .最终命令将如下所示:
summaryTable <- summaryTable[, list(sumDataSources=sum(msgNumRows), 
countDataSources=.N),
keyby=list(processDate, msgFileSource, msgDataSource) ]
keyby还具有将其参数设置为结果表的键的额外好处,其排序是此过程的副产品。

关于r - 如何对按 R 中的值分组的 data.table 求和和计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28548718/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com