r - 如何在 data.table 列表上应用聚合和 rbind?
问题描述
我尝试将此表示应用于许多 data.table 的列表,并根据许多标准进行聚合。我尝试了一些 lapply、mapply、for、...的组合,但没有成功。
我的输入数据是这个 data.table 列表:
nb.row <- 50
nb.col <- 5
lst.DT <- replicate(5, as.data.table(matrix(runif(n=nb.row*nb.col, min = 0, max = 100), nb.row, nb.col)), simplify = FALSE)
crit <- as.data.table(replicate(3,sample(1:5,nb.row, replace = TRUE)))
names(crit) <- c("C1", "C2", "C3")
lst.DT <- lapply(lst.DT, cbind, crit)
我试图总结的代码,以简化:
dt1.1 <- lst.DT[[1]][, .(new = sum(V4 / V5)), by = C1]
dt1.2 <- lst.DT[[1]][, .(new = sum(V4 / V5)), by = C2]
dt1.3 <- lst.DT[[1]][, .(new = sum(V4 / V5)), by = C3]
dt2.1 <- lst.DT[[2]][, .(new = sum(V4 / V5)), by = C1]
dt2.2 <- lst.DT[[2]][, .(new = sum(V4 / V5)), by = C2]
dt2.3 <- lst.DT[[2]][, .(new = sum(V4 / V5)), by = C3]
...
dtX.1 <- lst.DT[[X]][, .(new = sum(V4 / V5)), by = C1]
dtX.2 <- lst.DT[[X]][, .(new = sum(V4 / V5)), by = C2]
dtX.3 <- lst.DT[[X]][, .(new = sum(V4 / V5)), by = C3]
res1 <- rbindlist(list(dt1.1, dt1.2, dt1.3))
res2 <- rbindlist(list(dt2.1, dt2.2, dt2.3))
...
resX <- rbindlist(list(dtX.1, dtX.2, dtX.3))
最后返回一个与 lst.DT 具有相同维度的列表,其中包含 res1、res2、...
如何执行这种事情?非常感谢。
解决方案
这里我针对这个问题给出另一种分析观点。总之,我重点关注与不同列名C1,C2,C3相关的列表结构,然后rbind所有列表。
library(data.table)
sumby <- function(list_in,col_name){
lapply(list_in, function(x) x[,.(new = sum(V4/V5)), by = col_name])
}
lt1 <- sumby(lst.DT,"C1")
lt2 <- sumby(lst.DT,"C2")
lt3 <- sumby(lst.DT,"C3")
# unify df's name in list then rbind all list
lt2 <- lapply(lt2, function(x) x[,.(C1=C2,new)])
lt3 <- lapply(lt3, function(x) x[,.(C1=C3,new)])
resu1 <- mapply(rbind,lt1,lt2,lt3, SIMPLIFY=FALSE)
推荐阅读
- python - 让 QPushButton 执行 2 个动作?
- javascript - 当我试图从 php 文件中检索一个值到 javascript
- python - 在 Python 中展平树
- angularjs - 来自数据库AngularJS Jasmine的对象长度单元测试
- javascript - 模态工作错误
- ios - 代表返回 nil 并且没有被调用
- node.js - Firebase Stripe(错误)承诺必须妥善处理
- netlogo - 如何在 netlogo 的多个程序中使用 to-report
- c# - 使用 DotRas 创建的 IKEv2-VPN 中的远程 ID
- reactjs - 将路由分组为内部组件的 React Router Switch 语句不会转到 Not Found 路由