如何在mutate的case_when中实现推荐结果的滞后与前移?
解决方案:调整推荐列的行位置
问题说明
现有数据框df1,需基于多列条件创建recommendation列。当前代码已能匹配条件生成对应推荐,但需调整输出位置:
recommendation 1需滞后一行(显示在符合条件行的下一行)recommendation 2!需前移一行(显示在符合条件行的上一行)
原代码存在小问题:dplyr管道内不应使用df1$引用列,应直接用列名配合lead()函数。
实现方案
方法1:分步计算+位置调整(清晰易维护)
先计算所有符合条件的原始推荐标签,再通过lead()/lag()将标签移动到目标行:
library(dplyr) new_df <- df1 %>% # 第一步:计算原始推荐结果(不调整位置) mutate(temp_recommendation = case_when( optimal_stay_flag == "Too Short" & hour(Depart) < 18 & lead(`Max Speed`) < 18 ~ "recommendation 1", optimal_stay_flag == "Too Short" & hour(Depart) >= 18 & lead(`Max Speed`) < 18 ~ "recommendation 2!", TRUE ~ NA_character_ )) %>% # 第二步:调整推荐标签的位置 mutate(recommendation = case_when( # 若下一行的原始标签是recommendation1,当前行赋值 lead(temp_recommendation) == "recommendation 1" ~ "recommendation 1", # 若上一行的原始标签是recommendation2!,当前行赋值 lag(temp_recommendation) == "recommendation 2!" ~ "recommendation 2!", TRUE ~ NA_character_ )) %>% # 清理临时列,调整推荐列位置到Max Speed之后 select(-temp_recommendation) %>% relocate(recommendation, .after = `Max Speed`)
方法2:直接在条件中反向匹配(更简洁)
通过lag()/lead()反向定位条件行,直接在目标行生成推荐:
library(dplyr) new_df <- df1 %>% mutate(recommendation = case_when( # 匹配上一行满足recommendation1的条件,当前行赋值 lag(optimal_stay_flag == "Too Short" & hour(Depart) < 18 & lead(`Max Speed`, n=2) < 18) ~ "recommendation 1", # 匹配下一行满足recommendation2!的条件,当前行赋值 lead(optimal_stay_flag == "Too Short" & hour(Depart) >= 18 & lead(`Max Speed`) < 18) ~ "recommendation 2!", TRUE ~ NA_character_ )) %>% relocate(recommendation, .after = `Max Speed`)
关键说明
- dplyr管道内引用列时,避免使用
df1$,直接用列名即可(dplyr会自动识别当前数据集) lead(n=2)表示取当前行往后第2行的列值,用于在反向匹配时对应原始条件中的lead(Max Speed)
内容的提问来源于stack exchange,提问作者marcelklib
相关产品推荐
相关产品推荐

