You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 14:25:24