R语言跨两个数据框按GOAL、ID变量使用ifelse填列异常问题求解
错误原因
- 循环范围的
kids变量未定义,会直接导致循环无法正常执行,正确的遍历范围应为新增ID列的总数,即1:length(ids)。 - 匹配逻辑完全错位:判断条件中使用
A[,i+1]%in%B$ID,但此时A[,i+1]的所有值都是初始值0,永远不可能和B的ID列匹配,返回结果全为FALSE。 - 缺少核心关联规则:没有将「当前列对应的ID」和「B中该ID绑定的GOAL」做关联,仅判断GOAL是否存在于B中、ID是否存在于B中,无法判断二者是否为绑定的匹配组合。
修正代码
循环版(易理解)
for (i in 1:length(ids)) { # 获取当前列对应的ID current_id <- ids[i] # 匹配B中该ID对应的GOAL target_goal <- B$GOAL[B$ID == current_id] # 逐行判断A的GOAL是否与目标GOAL匹配,是则赋值1否则0 A[, i+1] <- ifelse(A$GOAL %in% target_goal, 1, 0) }
向量化版(效率更高,适合大数据量场景)
# 构建ID到GOAL的映射关系 id_goal_map <- setNames(B$GOAL, as.character(B$ID)) # 批量给所有ID列赋值 A[, as.character(ids)] <- lapply(ids, function(x) as.integer(A$GOAL == id_goal_map[as.character(x)]))
运行结果
按照你的示例数据运行后,得到的A表结果如下,仅ID为478的列在GOAL为A116642178的行取值为1,其余均为0,符合预期:
GOAL 313 475 165 478 1873 2165 1 A116642173 0 0 0 0 0 0 2 A116642174 0 0 0 0 0 0 3 A116642175 0 0 0 0 0 0 4 A116642176 0 0 0 0 0 0 5 A116642178 0 0 0 1 0 0 6 A116642181 0 0 0 0 0 0
内容的提问来源于stack exchange,提问作者Kat
相关产品推荐
相关产品推荐

