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

R语言dplyr中case_when+which.max处理分组数据问题

解决方案:根据Cycle和Estimate生成Out列

问题规则

需要基于以下逻辑生成out列:

  • 当cycle为M且estimate为空字符串时,out=1
  • 当cycle为M且estimate非空字符串时,out=0
  • 当cycle为O时,回溯最近的cycle=M行,若该行estimate为空则out=1,否则为0

可行代码实现

使用dplyr和tidyr包完成需求,代码如下:

library(dplyr)
library(tidyr)

# 假设数据集名为df
df |>
  group_by(item) |>
  # 为M行初始化临时结果,O行设为NA
  mutate(temp_out = case_when(
    cycle == "M" & estimate == "" ~ 1L,
    cycle == "M" & estimate != "" ~ 0L,
    TRUE ~ NA_integer_
  )) |>
  # 向下填充NA,让O行继承最近的M行的状态
  fill(temp_out, .direction = "down") |>
  # 生成最终out列并移除临时列
  mutate(out = temp_out) |>
  select(-temp_out) |>
  ungroup()

代码逻辑说明

  1. 初始化临时列:直接处理所有cycle=M的行,按规则赋值1或0;cycle=O的行暂时标记为NA。
  2. 向下填充NA:fill()函数会自动将每个O行的NA替换为最近的上方M行的temp_out值,精准实现"回溯最近M行"的需求。
  3. 整理结果:将临时列重命名为out,移除临时列完成处理。

原代码问题分析

你之前的代码中cycle == "O" & which.max(cycle == "M" & estimate == "") ~ 1存在逻辑错误:

  • which.max()返回的是整个分组内第一个满足cycle=M且estimate为空的行号,而非当前O行之前的最近M行,无法匹配每个O行对应的回溯结果。

验证结果

运行上述代码后,你的数据集将得到期望的out列:c(0, 0, 0, 0, 0, 0, 1)

内容的提问来源于stack exchange,提问作者jvalenti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 07:31:05