R语言使用for循环结合if/else为列分配级别时赋值结果异常
问题根源
你代码的核心错误有两个:
- 区间范围写错:你想匹配2-3顺位的
top 3分支,错误把上限设成了30,导致所有2-30顺位的数值都会直接命中这个分支 - 多分支判断顺序逻辑错误:
if-else if是按顺序匹配的,只要命中前面的分支就不会再走后面的判断,你把覆盖范围更大的分支放在了细分区间的前面,就算你改对了top3的区间上限,后续的其他细分区间也永远不会被触发。
另外你用行遍历for循环处理这类分箱操作效率极低,也容易出现索引引用错误。
修复方案
方案1:直接修正原逻辑(不推荐,仅做对照)
先把top 3的区间修正为2-3,再按顺位从小到大的顺序排列分支即可:
for(i in 1:nrow(draft_raptor)){ pick_num <- draft_raptor[i,24] if(pick_num == 1){ draft_raptor[i,27] <- "top pick" } else if(pick_num >=2 & pick_num <=3){ draft_raptor[i,27] <- "top 3" } else if(pick_num >=4 & pick_num <=5){ draft_raptor[i,27] <- "top 5" } else if(pick_num >=6 & pick_num <=10){ draft_raptor[i,27] <- "top 10" } else if(pick_num >=11 & pick_num <=14){ draft_raptor[i,27] <- "late lottery" } else if(pick_num >=15 & pick_num <=23){ draft_raptor[i,27] <- "mid 1st round" } else if(pick_num >=24 & pick_num <=30){ draft_raptor[i,27] <- "late first" } else if(pick_num >=31 & pick_num <=40){ draft_raptor[i,27] <- "early 2nd" } else if(pick_num >=41 & pick_num <=50){ draft_raptor[i,27] <- "mid 2nd" } else if(pick_num >=51 & pick_num <=60){ draft_raptor[i,27] <- "late 2nd" } }
方案2:用dplyr::case_when做向量化分箱(推荐)
不用写循环,代码更简洁易读,运行效率也高:
library(dplyr) draft_raptor <- draft_raptor %>% mutate( draft_level = case_when( numberPickOverall == 1 ~ "top pick", numberPickOverall %in% 2:3 ~ "top 3", numberPickOverall %in% 4:5 ~ "top 5", numberPickOverall %in% 6:10 ~ "top 10", numberPickOverall %in% 11:14 ~ "late lottery", numberPickOverall %in% 15:23 ~ "mid 1st round", numberPickOverall %in% 24:30 ~ "late first", numberPickOverall %in% 31:40 ~ "early 2nd", numberPickOverall %in% 41:50 ~ "mid 2nd", numberPickOverall %in% 51:60 ~ "late 2nd" ) )
内容的提问来源于stack exchange,提问作者Luke Lilly
相关产品推荐
相关产品推荐

