如何用循环/条件语句在NA数量可变时仅向下填充特定值?
R语言:用for循环+if-else实现特定条件的向下填充
需求说明
仅当列b的值为86,且后续行与当前行的列a(分组标识,取值A/B/C)相同时,将86向下填充到后续的NA单元格中;对于86以外的数值(如示例中的88),即使同组也不进行填充。
初始数据
# 创建初始数据框 a <- c('A','A','A','A','B','B','B','C','C','C','C') b <- c(NA,NA,86,NA,NA,88,NA,NA,86,NA,NA) df <- data.frame(a,b) df
期望输出
# 期望得到的数据框 a <- c('A','A','A','A','B','B','B','C','C','C','C') b <- c(NA,NA,86,86,NA,88,NA,NA,86,86,86) df <- data.frame(a,b) df
实现代码(for循环+if-else)
可以通过遍历每行、记录填充状态的方式实现,完全适配NA数量不固定的场景:
# 初始化填充状态变量 current_fill <- NA current_group <- NA # 遍历数据框每一行 for (i in 1:nrow(df)) { # 处理当前行b列非NA的情况 if (!is.na(df$b[i])) { if (df$b[i] == 86) { # 遇到86时,更新填充值和对应分组 current_fill <- df$b[i] current_group <- df$a[i] } else { # 遇到非86的数值,重置填充状态 current_fill <- NA current_group <- NA } } else { # 处理当前行b列为NA的情况 if (!is.na(current_fill) && df$a[i] == current_group) { # 同组且有有效填充值时,填充86 df$b[i] <- current_fill } } } # 查看最终结果 print(df)
代码逻辑说明
- 用
current_fill记录当前待填充的86值,current_group记录对应的分组(列a的值) - 遍历过程中:
- 若当前行
b列是86,更新填充状态,为后续同组NA行做准备 - 若当前行
b列是非86的数值,直接重置填充状态,避免错误填充 - 若当前行
b列是NA,检查是否属于current_group且有有效填充值,满足则填充86
- 若当前行
内容的提问来源于stack exchange,提问作者pandas123
相关产品推荐
相关产品推荐

