如何用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
相关产品推荐
相关产品推荐

