R语言如何按优先级顺序筛选dataframe中dt_diff列符合条件的行
R实现按优先级筛选dt_diff列对应行的方案
原代码错误原因
- 循环内部强制赋值
i <- 2,覆盖了循环遍历逻辑,无法按顺序检查1到20的取值 - 条件判断逻辑错误:
any(dt_df$dt_diff) == i的执行逻辑是先判断dt_diff列是否存在非0值,返回TRUE/FALSE后再和i比较,完全不符合「检查是否存在dt_diff等于i的行」的需求,正确写法应为any(dt_df$dt_diff == i) - 检查顺序不符合要求:原代码遍历的
pbl_dt_seq是从-1开始,而需求要求优先检查1~20,再检查0,最后检查-1
正确实现方案
方案1:易理解的for循环版本
按照需求的优先级构造检查序列,遍历到第一个存在的取值就筛选退出:
# 加载dplyr(未加载时执行) library(dplyr) # 构造符合优先级的检查序列:先1-20,再0,再-1 check_seq <- c(1:20, 0, -1) # 初始化结果对象 retain_dt <- data.frame() # 遍历检查 for (val in check_seq) { if (any(dt_df$dt_diff == val)) { retain_dt <- dt_df %>% filter(dt_diff == val) break } } # 输出结果 retain_dt
方案2:向量化简洁版本(无需循环)
直接通过优先级映射取最高优先级的取值筛选,代码更简洁高效:
library(dplyr) retain_dt <- dt_df %>% mutate(priority = case_when( dt_diff >=1 & dt_diff <=20 ~ dt_diff, dt_diff == 0 ~ 21, dt_diff == -1 ~ 22 )) %>% filter(priority == min(priority)) %>% select(-priority)
示例数据运行结果
你提供的示例数据中dt_diff的取值为18、2、0,按优先级规则第一个存在的取值是2,运行代码后会返回所有dt_diff=2的8行结果。
内容的提问来源于stack exchange,提问作者Lily Nature
相关产品推荐
相关产品推荐

