data.table 分组所有列的总和

Posted

技术标签:

【中文标题】data.table 分组所有列的总和【英文标题】:data.table sum of all colums by group 【发布时间】:2022-01-18 17:40:52 【问题描述】:

我有一个由 515 个整数列和 2 643 246 行组成的数据框,我想从中对未知数量的列进行子集化,并将数据聚合到一个显示总和的列中,按两个组列。

为了完成第一部分,我使用了 data.table 中的选择功能,如下所示,

TestData[,c(Kattegori_Henter("Medicine"), "id", "year"), with = FALSE]

Kattegori_Henter 是一个函数,它返回我想从不同数据集中选择的列的名称。然后我想从这个选择中进行聚合。

我在 data.table 中尝试了几种不同的解决方案来执行此聚合,但没有得到结果。鉴于 intro-data.table 小插图,我认为解决方案是添加

TestData[,c(Kattegori_Henter("Medicine"), "id", "year"), with = FALSE, lapply(.SD,sum, na.rm = 
         TRUE), by = c(id, year)]

但是,这会返回错误Provide either by= or keyby= but not both,我不明白它的含义,并且谷歌没有给出任何好的结果。

然后我尝试:

TestData[,c(Kattegori_Henter("Medicine"), "id", "year"), with = FALSE, a := sum(1.ncol), by = c(id, year)]    

除了返回子集数据框之外,根本没有产生任何结果。

这样做的原因是我想在 kattegori_henterfunction 上使用 lapply,将 525 列聚合成一组类别。

提前感谢所有帮助!

编辑:

尝试过

   TestData[,c(Kattegori_Henter("Medicine"), "id", "year"), with =  
   FALSE][, lapply(.SD, sum, na.rm = TRUE), by = c("id", "year")]

如 cmets 中所述。结果与上面的第二个代码相同,返回一个未更改的数据帧。

编辑 2:

从问题中删除了这个,因为对它的评论没有产生想要的结果: ",这将等于 tidyverse-code:

Test2 %>% 
group_by(id, year) %>% 
summarise(a = sum(1:ncol(.), na.rm = TRUE)) "

【问题讨论】:

data.table 语法是DT[i,j,by],您可以通过链接/管道化为DT[i,j,by][i,j,by] 对其进行扩展——您将所有这些都放在一组方括号中,更像DT[,i, j, j, by]。我想你需要像TestData[,c(Kattegori_Henter("Medicine"), "id", "year"), with = FALSE][, lapply(.SD,sum, na.rm=TRUE), by = c(id, year)] 这样的东西 - 如果它有效(我无法测试它)然后让我知道,我会把它作为答案发布 与内置数据等效的演示:DT <- data.table(iris); DT[, .(Petal.Length, Sepal.Length, Species)][, sum(.SD), by=Species] 您的group_by(.) %>% summarize(sum(1:ncol(.))) 代码是模糊的:因为您只关心列数,这完全等同于ncol(.) * (ncol(.)+1) / 2(将前n 个自然数相加)。这让您认为这需要按组完成?此外,您不需要框架中的任何内容来执行此操作,只需 n <- length(c(Kattegori_Henter("Medicine"), "id", "year")); n*(n+1)/2 也应该可以工作。我错过了什么? 对于您的情况,这应该有效:TestData[, sum(.SD), by = .(id, year), .SDcols = colnames(TestData[, Kattegori_Henter("Medicine")])] @rg255 添加了关于您的提案的编辑! 【参考方案1】:

我认为您正在寻找的代码很可能是:

TestData[, .(a = sum(.SD)), by = .(id, year), .SDcols = Kattegori_Henter("Medicine")]

【讨论】:

以上是关于data.table 分组所有列的总和的主要内容,如果未能解决你的问题,请参考以下文章

如何根据分组变量计算所有列的总和并删除 NA

熊猫:设置列等于另一列的分组总和[重复]

SELECT 语句以获取具有列标题的分组列的总和

在 R 中,自定义由 dcast.data.table 创建的列的名称

将查询分组为 3 列,并在 Apex Oracle 中显示另一列的总和

按一列分组并在熊猫中找到另一列的总和和最大值