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

如何在R数据框中按组将首个非NA值向下填充至指定后续行?

按组填充首个目标值至组末尾的解决方案

需求说明

针对分组数据框,需实现:

  • 将每组内首次出现目标值(示例中为1)之后的所有单元格替换为该目标值
  • 保留首次目标值之前的NA
  • 全为NA的组保持所有NA不变

示例数据

myDF <- data.frame(
  ID = c(1,1,1,1,2,2,2,3,3,3),
  State = c(NA,NA,1,NA,1,NA,NA,NA,NA,NA))

方法1:使用dplyr实现

通过分组标记首次目标值的位置,再对后续行进行替换:

library(dplyr)

myDF_processed <- myDF %>%
  group_by(ID) %>%
  mutate(
    # 获取组内第一个1的行号,无1则为NA
    first_1_pos = which(State == 1)[1],
    # 对首次1之后的行替换为1,其余保留原值
    State_filled = ifelse(row_number() >= first_1_pos & !is.na(first_1_pos), 1, State)
  ) %>%
  ungroup() %>%
  # 可选:覆盖原State列
  select(ID, State = State_filled)

方法2:使用data.table实现

利用data.table的分组特性,直接定位并替换目标范围:

library(data.table)

setDT(myDF)
myDF[, State_filled := {
  first_1_pos = which(State == 1)[1]
  # 存在目标值时,替换从首次位置到组末尾的所有值
  if (!is.na(first_1_pos)) {
    replace(State, seq(first_1_pos, .N), 1)
  } else {
    State
  }
}, by = ID]

# 可选:覆盖原State列并删除临时列
myDF[, State := State_filled][, State_filled := NULL]

处理后结果

最终数据框如下:

IDState
1NA
1NA
11
11
21
21
21
3NA
3NA
3NA

内容的提问来源于stack exchange,提问作者Curious Jorge - user9788072

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:15:35