R中如何高效将data.table指定列按匹配键复制到另一个data.table
R data.table 匹配列复制的最优方案
对于你已经设置好键的百万行级data.table,最简洁高效的写法是利用data.table原生的连接赋值语法,不需要match也不需要merge生成临时表:
# 原地给DT2新增y列,匹配逻辑和你原需求完全一致 DT2[DT1, on = .(id2 = id1), y := i.z]
语法说明
- 核心是
X[Y, on = ., col := value]的原地更新连接逻辑:以Y为索引匹配X的行,直接在X上修改/新增列,不会生成额外的副本 on = .(id2 = id1)指定匹配规则:DT2的id2列对应DT1的id1列,你已经提前用setkey设置了两个表的键,这里可以省略on参数,写全更清晰不会出错i.z表示取连接中i端(也就是方括号里的DT1)的z列,避免和DT2本身的z列重名冲突
性能对比
你之前担心的match开销完全可以避免:
match是向量级操作,时间复杂度为O(n log m),没有用到你提前构建的键索引,百万行下速度比原生连接慢2~10倍- merge方案需要生成新的data.table对象,上百列的场景下会产生大量不必要的内存拷贝,内存开销是原地更新的数倍
- 上述连接赋值方案利用预构建的键做二进制搜索,时间复杂度O(n),且直接在原表修改,内存开销几乎可以忽略,是针对你场景的最优解
示例验证
在你给出的测试代码中,清空y列后执行上述语法:
DT2[, y := NULL] DT2[DT1, on = .(id2 = id1), y := i.z] print(DT2) # id2 x z y # 1: 1 E 21 NA # 2: 2 F 22 11 # 3: 3 G 23 12 # 4: 4 H 24 13
运行结果和你原来的两种实现完全一致。
内容的提问来源于stack exchange,提问作者chan1142
相关产品推荐
相关产品推荐

