基于NA出现情况为R语言数据框创建分组变量
问题描述
现有R语言数据框df:
df <- data.frame(x = c(1, 1, NA, 1, 1, NA, NA, 1, 1))
需要创建分组列y,满足以下规则:
- 遇到
NA时,y值在前一个基础上加1 - 连续
NA仅首次触发加1,后续y值保持不变
预期结果:
x y 1 1 1 2 1 1 3 NA 2 4 1 2 5 1 2 6 NA 3 7 NA 3 8 1 3 9 1 3
解决方案1:Base R实现
核心思路是先标记首次出现的NA(即当前行是NA且上一行不是NA的位置),再对标记结果做累加运算,最后加上初始分组值1即可得到目标列y。
# 标记首次出现的NA位置:当前行是NA且前一行不是NA na_first <- c(FALSE, diff(is.na(df$x)) == 1) # 计算分组y:初始为1,累加首次NA的标记 df$y <- 1 + cumsum(na_first)
验证输出:
print(df) # x y # 1 1 1 # 2 1 1 # 3 NA 2 # 4 1 2 # 5 1 2 # 6 NA 3 # 7 NA 3 # 8 1 3 # 9 1 3
解决方案2:dplyr实现
如果习惯使用tidyverse工具链,可借助dplyr的窗口函数完成逻辑:
library(dplyr) df <- df %>% mutate( # 标记首次出现的NA na_first = lag(is.na(x), default = FALSE) != is.na(x) & is.na(x), # 累加标记得到分组 y = 1 + cumsum(na_first) )
内容的提问来源于stack exchange,提问作者user18894435
相关产品推荐
相关产品推荐

