多类型多变量场景下data.table条件合并的高效实现方案问询
最优data.table实现方案
完全基于data.table原生语法,支持任意数量的人群类型、待合并变量,无需手动逐个编写列名,运行效率远高于逐次合并写法。
完整可运行代码
set.seed(1) library(data.table) # 构造原始数据 DT1 <- data.table(income = runif(10, 0,1), ID = 1:10) DT2 <- data.table(height = runif(20,0,1), weight = runif(20,0,1), V1 = runif(20,0,1), V2 = runif(20,0,2), type = rep(c("Parents", "Children"),10)) DT2 <- DT2[order(type)][, ID := rep(1:10,2)] # 自定义配置:仅需修改这部分即可适配不同变量、不同人群类型的场景 merge_variables = c("height", "weight", "V1", "V2") # 如需统一后缀大小写,可放开下面这行将人群类型统一转为小写 # DT2[, type := tolower(type)] # 步骤1:将DT2从长表转为宽表,自动生成「变量名_人群类型」格式的列名 DT2_wide <- dcast(DT2, ID ~ type, value.var = merge_variables, sep = "_") # 步骤2:一次性将所有衍生字段批量合并更新到DT1中 DT1[DT2_wide, on = .(ID), names(DT2_wide)[-1] := mget(paste0("i.", names(DT2_wide)[-1]))]
代码逻辑说明
dcast是data.table原生的长宽转换函数,通过value.var传入自定义的待合并变量向量,sep = "_参数会自动按照要求生成「变量名_人群类型」格式的新列名。- 批量赋值阶段,通过
names(DT2_wide)[-1]自动提取所有要合并的字段(自动排除ID列),mget批量匹配右表对应字段,无需手动编写任何列名。 - 该方案避免了多次合并的性能开销,数据量越大、变量/人群类型越多,性能优势越明显。
内容的提问来源于stack exchange,提问作者plausibly_exogenous
相关产品推荐
相关产品推荐

