data.table条件左连接时income列被覆盖的解决方法求助
在data.table中实现条件非等值连接(cost < income)的正确方式
你的问题出在非等值连接的列引用上:当使用on=.(income>cost)这类不等连接语法时,data.table会将income列替换为用于比较的cost值(来自被连接的表A),而非保留B表原有的income数据。要解决这个问题,需要明确指定引用原表的列。
正确代码实现
以下两种写法都能得到和你提供的dplyr代码完全一致的结果,且效率远高于先交叉连接再过滤的方式:
写法1:以A为主表,匹配B中满足cost < income的行
A <- data.table(ID=c(1,2,3,4),cost=c(1000,2000,3000,4000)) B <- data.table(income=c(1500,2500,3500,4500),name=c("A","B","C","D")) A[B, .(ID, cost, income = i.income, name = i.name), on = .(cost < income), allow.cartesian = TRUE]
写法2:以B为主表,匹配A中满足cost < income的行
B[A, .(ID = i.ID, cost = i.cost, income = x.income, name = x.name), on = .(income > cost), allow.cartesian = TRUE]
关键说明
- 在
X[Y]的data.table语法中:X是x表(被查找的基础表),引用其列用x.列名Y是i表(用来匹配的表),引用其列用i.列名
- 你原来的代码中直接写
income,会被解析为连接条件里的比较值(A表的cost),而非B表的原始income,因此必须用x.income(写法2)或i.income(写法1)明确指定列来源。 allow.cartesian=TRUE是因为每个A的行可能匹配多个B的行,需要允许笛卡尔积类型的匹配,这和你dplyr代码中先全连接再过滤的逻辑一致。
内容的提问来源于stack exchange,提问作者Fobos
相关产品推荐
相关产品推荐

