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

如何基于指定规则修改DataFrame中outcome列的数值?

问题描述

给定如下R数据框:

idp<-sort(rep(c("A","B","C","D"),10))
a1<-c(1,1,1,2,3,4,3,4,2,2)
a2<-c(3,3,NA,NA,4,1,2,3,1,1)
a3<-c(NA,NA,1,1,2,2,4,NA,NA,1)
a4<-c(4,3,2,1,NA,NA,NA,1,2,3)
dat<-data.frame(idp,outcome=c(a1,a2,a3,a4))

其中idp为人员标识,outcome列取值代表状态,4表示“死亡”状态。需按以下规则对每个idp对应的outcome序列修改:

  • 若序列中出现4,其后续所有值设为4
  • 若出现NA,用紧邻的前一个非NA状态值替换
  • 若序列以NA开头,用序列中第一个出现的非缺失状态值填充
解决方案

使用dplyr分组处理结合tidyr的填充函数实现需求,代码如下:

library(dplyr)
library(tidyr)

dat_processed <- dat %>%
  group_by(idp) %>%
  # 标记每组第一个死亡状态的位置,后续值统一设为4
  mutate(
    first_death = which(outcome == 4)[1],
    outcome = ifelse(!is.na(first_death) & row_number() >= first_death, 4, outcome)
  ) %>%
  # 先向下填充NA,再向上填充开头的缺失值
  fill(outcome, .direction = "downup") %>%
  # 移除辅助计算列
  select(-first_death) %>%
  ungroup()

代码说明

  • group_by(idp):按人员标识分组,保证每个人员的状态序列独立处理
  • 标记first_death为每组中第一个4的行号,若不存在死亡状态则为NA;通过行号判断将死亡后的所有值设为4
  • fill(outcome, .direction = "downup"):先完成前向填充(解决中间NA),再反向填充开头的NA,同时满足规则2和3
  • 最后移除辅助列并取消分组

内容的提问来源于stack exchange,提问作者sanmath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 07:16:16