如何基于指定规则修改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
相关产品推荐
相关产品推荐

