如何用R识别列中连续5个NA并标记为指定值5X?
在R中标记连续5个NA的序列
下面提供两种匹配不同需求的实现方案,你可以按需选择:
方案1:为每个连续NA的位置标记"5X"
使用dplyr结合rle函数识别连续NA的长度,再为符合条件的位置添加标记:
library(dplyr) # 构造与你提供的结构一致的示例数据集 df <- tibble(Outcome = c(rep(NA, 5), 0, 1, rep(NA, 5), 1, 2, rep(NA, 5))) df <- df %>% mutate( # 计算每个位置所属的连续NA序列长度 na_run_length = inverse.rle(within.list(rle(is.na(Outcome)), values = ifelse(values, lengths, 0))), # 为连续5个NA的位置标记"5X",其余位置留空 `New Variable Column` = ifelse(na_run_length == 5, "5X", "") ) # 查看处理后的结果 print(df)
方案2:仅在连续5个NA的起始位置标记"5X"
如果只需要在每段连续5个NA的第一个位置标记,调整逻辑如下:
df <- df %>% mutate( na_run_length = inverse.rle(within.list(rle(is.na(Outcome)), values = ifelse(values, lengths, 0))), `New Variable Column` = case_when( na_run_length == 5 & lag(na_run_length, default = 0) != 5 ~ "5X", TRUE ~ "" ) )
基础R实现(无需额外包)
如果不想依赖dplyr,用基础R也能完成:
# 构造示例数据集 df <- data.frame(Outcome = c(rep(NA, 5), 0, 1, rep(NA, 5), 1, 2, rep(NA, 5))) # 计算连续NA的序列长度 r_obj <- rle(is.na(df$Outcome)) r_obj$values <- ifelse(r_obj$values, r_obj$lengths, 0) na_run_length <- inverse.rle(r_obj) # 生成标记列 df$`New Variable Column` <- ifelse(na_run_length == 5, "5X", "")
内容的提问来源于stack exchange,提问作者whosurdata
相关产品推荐
相关产品推荐

