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

如何用dplyr在R数据框中按前置非NA值填充NA为递增整数

用dplyr实现NA值按规则替换的R方案

原始数据

先构造输入数据:

df <- data.frame(
  ID = c("A", "A", "B", "C", "C", "D", "D", "D", "F", "G", "H"),
  Number = c(1, 1, NA, NA, NA, 3, 3, 3, NA, 6, NA)
)

需求说明

需要将Number列的NA值替换为前置最近非NA值的下一个整数,且同一ID对应的所有行数值保持一致。

实现代码

结合dplyr和purrr的accumulate函数可以高效实现:

library(dplyr)
library(purrr)

result_df <- df %>%
  # 提取每个ID的首次出现记录,保留原顺序
  distinct(ID, .keep_all = TRUE) %>%
  # 递推填充NA:非NA值保留,NA值取前一个处理后的值+1
  mutate(Number = accumulate(Number, ~ if (is.na(.y)) .x + 1 else .y)) %>%
  # 将处理后的数值映射回原数据框
  right_join(df, by = "ID") %>%
  # 调整列名并恢复原数据行顺序
  select(ID, Number = Number.x) %>%
  arrange(match(ID, df$ID))

# 输出结果
print(result_df)

运行结果

执行后得到目标数据:

ID Number
1   A      1
2   A      1
3   B      2
4   C      3
5   C      3
6   D      3
7   D      3
8   D      3
9   F      4
10  G      6
11  H      7

代码解释

  • distinct(ID, .keep_all = TRUE):确保每个ID只保留首次出现的记录,维持原数据中ID的出现顺序。
  • accumulate(...):遍历Number列,对每个NA值,用前一个已确定的数值加1填充;非NA值直接保留,实现递推式的数值生成。
  • right_join:将处理后的ID-数值映射回原数据,保证所有原始行都被保留。
  • arrange(match(ID, df$ID)):恢复原数据的行顺序,避免join后顺序错乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:40:38