如何在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]
处理后结果
最终数据框如下:
| ID | State |
|---|---|
| 1 | NA |
| 1 | NA |
| 1 | 1 |
| 1 | 1 |
| 2 | 1 |
| 2 | 1 |
| 2 | 1 |
| 3 | NA |
| 3 | NA |
| 3 | NA |
内容的提问来源于stack exchange,提问作者Curious Jorge - user9788072
相关产品推荐
相关产品推荐

