Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何对R中按值分组的data.table进行求和和计数_R_Data.table - Fatal编程技术网

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

如何对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

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

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) ]