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()
代码逻辑说明
- 初始化临时列:直接处理所有
cycle=M的行,按规则赋值1或0;cycle=O的行暂时标记为NA。 - 向下填充NA:
fill()函数会自动将每个O行的NA替换为最近的上方M行的temp_out值,精准实现"回溯最近M行"的需求。 - 整理结果:将临时列重命名为
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
相关产品推荐
相关产品推荐

