使用含ifelse的For Loop生成数据框指示变量遇问题求助
问题排查与解决方案
一、循环逻辑错误分析
- 你的for循环每轮都会用当前的领导姓名
b去匹配所有行,else分支会把之前已经标记为1的行重新设为0。举个实际运行的例子:- 第一轮循环
b="Tamira Hughes",没有匹配的行,所有行的both_recip_boss被设为0; - 第二轮循环
b="John Legend",匹配第三行,第三行设为1,其余行设为0; - 第三轮循环
b="Robert Collins",没有匹配的行,所有行又被设为0;
最终只有当最后一个领导姓名有匹配时,才会留下1,否则全部为0,这就是你只得到少数1的核心原因。
- 第一轮循环
- 另外,
ifelse的用法也不对:ifelse是向量运算,应该直接赋值给列,而不是在分支里用赋值语句,你的写法会导致整个列被批量覆盖,而非逐行判断。
二、正确解决方案
方法1:向量化操作(推荐,无需循环)
直接用%in%判断姓名是否在领导向量里,再转成0/1格式,这是R里最高效的写法:
# 直接生成指示变量 SurveyData$both_recip_boss <- as.integer(SurveyData$RecipientFullName %in% bossrecip)
解释:%in%会逐行检查RecipientFullName是否存在于bossrecip中,返回布尔值(TRUE/FALSE),as.integer会把TRUE转成1,FALSE转成0。
方法2:修复for循环(如果一定要用循环)
要避免覆盖之前的结果,应该只在匹配时把对应行设为1,不做0的覆盖操作:
# 初始化列为0 SurveyData$both_recip_boss <- 0 # 循环遍历每个领导姓名,匹配到的行设为1 for (b in bossrecip) { # 找到匹配的行索引,设为1 match_rows <- which(SurveyData$RecipientFullName == b) SurveyData$both_recip_boss[match_rows] <- 1 }
解释:每次循环只修改匹配到的行,不会触碰已经是1的行,这样所有匹配到任意领导姓名的行都会被标记为1。
内容的提问来源于stack exchange,提问作者poppiytt
相关产品推荐
相关产品推荐

