R语言:为值1后的NA行填充连续计数的实现方案
解决思路与实现代码
可以通过分组计数的方式实现需求,核心逻辑是先给每个1及其后续的NA划分独立分组,再在分组内生成连续递增的数值:
- 生成分组标识:用
cumsum(!is.na(a))标记分组,每次遇到非NA的1时分组号自动加1,这样每个1和它后面的NA会被分到同一个组,最开始的NA分组号为0。 - 分组内生成计数:对每个分组,用
row_number()获取组内行位置,分组号大于0时,该位置值就是需要的递增数值;分组号为0的部分保持NA即可。
对应的R代码实现(基于dplyr):
library(dplyr) df <- tibble(a = c(NA, NA, 1, NA, NA, NA, 1, NA, NA)) df2 <- df %>% mutate(group = cumsum(!is.na(a))) %>% group_by(group) %>% mutate(a = ifelse(group == 0, NA, row_number())) %>% ungroup() %>% select(-group) # 输出结果 df2
运行后得到的结果与预期一致:
# A tibble: 9 × 1 a <int> 1 NA 2 NA 3 1 4 2 5 3 6 4 7 1 8 2 9 3
如果习惯用data.table,也可以用以下代码实现,逻辑相同:
library(data.table) setDT(df) df[, group := cumsum(!is.na(a))] df[group != 0, a := .I - first(.I) + 1, by = group] df[, group := NULL]
内容的提问来源于stack exchange,提问作者johnny
相关产品推荐
相关产品推荐

