基于AND条件合并两个data.table并添加新列的实现问题
解决data.table匹配赋值时的行数不匹配问题
你的错误本质是直接用逻辑索引取值时,返回的元素数量和commuters_new的行数不一致——要么commuters_old里有多个匹配项导致返回更多元素,要么部分行无匹配导致返回更少元素。用data.table的左连接可以完美解决这个问题,同时高效处理百万级数据:
步骤1:匹配并填充amount1列
利用data.table的键连接或merge操作,确保结果行数和commuters_new完全一致,无匹配项自动填充0:
方法1:data.table原生键连接(推荐,速度更快)
library(data.table) # 为两个表设置匹配键(from1和to1) setkey(commuters_old, from1, to1) setkey(commuters_new, from1, to1) # 左连接,将commuters_old的amount1匹配到commuters_new commuters_new[commuters_old, amount1 := i.amount1] # 将未匹配到的NA替换为0 commuters_new[is.na(amount1), amount1 := 0]
方法2:merge函数(更直观)
library(data.table) # 左连接,仅保留需要匹配的字段 commuters_new <- merge(commuters_new, commuters_old[, .(from1, to1, amount1_old = amount1)], by = c("from1", "to1"), all.x = TRUE) # 保留commuters_new的所有行 # 替换NA为0,并重命名为amount1 commuters_new[, `:=`(amount1 = ifelse(is.na(amount1_old), 0, amount1_old), amount1_old = NULL)] # 删除临时列
步骤2:计算factor列
直接用ifelse判断amount1是否为0,避免除以0的错误:
commuters_new[, factor := ifelse(amount1 == 0, 0, amount2 / amount1)]
这样处理后,所有操作都会严格对应commuters_new的1408969行观测,不会再出现行数不匹配的报错。
内容的提问来源于stack exchange,提问作者Ann
相关产品推荐
相关产品推荐

