【发布时间】:2022-01-13 20:52:06
【问题描述】:
有没有比下面两个更优雅的解决方案来对 data.table 列集执行多个操作?我所说的“更优雅”是指作为一个单行而不是结合中间结果。
请注意,我在此特定示例中使用了by,但该问题也适用于非by 情况。
library(data.table)
# create toy data.table
dt <- data.table(
ID=sample(1:10, 50, replace=TRUE),
A=letters[sample(1:26, 50, replace=TRUE)],
B=letters[sample(1:26, 50, replace=TRUE)],
C=letters[sample(1:26, 50, replace=TRUE)],
D=letters[sample(1:26, 50, replace=TRUE)]
)
# two sets of columns to process differently
use_all <- c("A","B")
just_first <- c("C","D")
# do these separately, then bind columns. assumes the `by` column is identical across the two:
results <- data.table(
dt[, lapply(.SD, function(x) x[1]), by=ID, .SDcols= just_first],
dt[, lapply(.SD, function(x) list(x)), by=ID, .SDcols= use_all][, .SD, .SDcols=-"ID"]
)
# do these separately, then merge. doesn't assume the `by` column is identically ordered:
results <- merge(
dt[, lapply(.SD, function(x) x[1]), by=ID, .SDcols= just_first],
dt[, lapply(.SD, function(x) list(x)), by=ID, .SDcols= use_all],
by="ID"
)
【问题讨论】:
标签: r data.table