R语言中如何按条件修改删失数据指定行的特定值
删失数据处理:标记失访对象(替换首个NA为0)
问题背景
现有一组删失数据,标记规则如下:
".":存活对象1:死亡对象0:失访对象(需生成)
原始数据定义:
T1 <- c(".",".",".",".",".") T2 <- c(".",".",".",".",".") T3 <- c(".",1,".",NA,".") T4 <- c(NA,NA,".",NA,1) T5 <- c(NA,NA,".", NA,NA) df <- data.frame(T1,T2,T3,T4,T5)
原始数据输出:
T1 T2 T3 T4 T5 1 . . . <NA> <NA> 2 . . 1 <NA> <NA> 3 . . . . . 4 . . <NA> <NA> <NA> 5 . . . 1 <NA>
需求:对所有不含1的行,将该行第一个NA替换为0,以此标记失访对象;可先将"."替换为数值99解决类型兼容问题。
实现方案
步骤1:统一数据类型,替换"."为99
由于字符型和数值型混合会导致处理困难,先将所有"."替换为数值99,同时保留NA和1:
library(dplyr) library(stringr) # 转换数据类型并替换标记 df_processed <- df %>% mutate(across(everything(), ~ as.numeric(str_replace(., "\\.", "99"))))
转换后的数据:
T1 T2 T3 T4 T5 1 99 99 99 NA NA 2 99 99 1 NA NA 3 99 99 99 99 99 4 99 99 NA NA NA 5 99 99 99 1 NA
步骤2:识别目标行并替换首个NA为0
逐行判断是否包含1,对不含1的行,找到第一个NA的位置并替换为0:
df_processed <- df_processed %>% rowwise() %>% mutate( # 标记当前行是否存在死亡标记1 has_death = any(c_across(everything()) == 1, na.rm = TRUE), # 获取该行第一个NA的列索引 first_na_idx = which(is.na(c_across(everything())))[1], # 对目标列替换NA为0 across(everything(), ~ ifelse(!has_death & cur_column() == colnames(df_processed)[first_na_idx], 0, .)) ) %>% ungroup() %>% select(-has_death, -first_na_idx) # 移除临时辅助列
步骤3:可选:恢复原始存活标记"."
如果需要将99转回原来的".",执行以下代码:
df_final <- df_processed %>% mutate(across(everything(), ~ case_when( . == 99 ~ ".", . == 0 ~ "0", . == 1 ~ "1", is.na(.) ~ NA_character_ )))
最终输出结果:
T1 T2 T3 T4 T5 1 . . . 0 <NA> 2 . . 1 <NA> <NA> 3 . . . . . 4 . . 0 <NA> <NA> 5 . . . 1 <NA>
内容的提问来源于stack exchange,提问作者user21027866
相关产品推荐
相关产品推荐

