【发布时间】:2022-11-20 18:03:37
【问题描述】:
我正在学习使用data.table,因为我正在处理非常大的数据并且需要速度。为了便于使用,我一直使用dplyr,但现在想更多地使用data.table。
在底部运行代码时,我向数据框 testDF 添加了一个“总计”列。这是我的data.table技能结束的地方。但我真正需要的是“总计”> 0 的实例的每个“ID”。所以我在这个例子中寻找的输出只是 1 和 50,这些 ID 是“总计”> 0。我将如何有效地计算这个使用data.table?请注意,这将运行的实际数据库有数百万行,因此我希望避免不必要的计算。
我包括看似无关的列“Period_1”、“Period_2”和“State”,因为当我在使用 data.table 子集时,在运行 lapply(.SD,sum),by=.(ID)][,if(sum(PUR)>0) .SD,by=ID] 之类的东西时,我遇到了类似这样的错误
“sum(Period_2) 错误:参数的“类型”(字符)无效“
我将使用这些输出进行“连接”,这是我可以在data.table 中做的事情(我认为)。
下面是运行代码时的输出视图:
代码:
library(data.table)
testDF <-
data.frame(
ID = as.numeric(c(rep(1,3),rep(50,3),rep(60,3))),
Period_1 = as.numeric(c(1:3,1:3,1:3)),
Period_2 = c("2012-06","2012-07","2012-08","2013-06","2013-07","2013-08","2012-01","2012-02","2012-03"),
PUR = as.numeric(c(rep(10,3),21:23,rep(0,3))),
CA = as.numeric(c(rep(5,3),11:13,rep(0,3))),
State = c("XX","AA","XX","AA","BB","CC","SS","XX","AA")
)
testDF_Adv <- testDF
setDT(testDF_Adv)[, total := sum(PUR + CA), by=list(ID)]
testDF_Adv <- as.data.frame(testDF_Adv)
testDF_Adv
【问题讨论】:
标签: r data.table