You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 12:45:34