R语言中数据框Status列打乱后删除冗余行的实现
解决方案:用dplyr实现随机重排死亡状态并设置NA
首先,我们可以利用dplyr的分组和随机抽样功能来实现需求:每个ID随机指定一个死亡时间点(Status=1),该时间点之前的状态保持为0,之后的状态设为NA。以下是完整的代码实现:
1. 构造原始数据(如果已有数据可跳过这一步)
library(dplyr) # 你的原始数据框 df <- tibble( ID = c(1,1,1,2,2,2,3,3,3,3), Status = c(0,0,1,0,0,0,0,0,0,1) )
2. 处理数据
# 设置随机种子,确保结果可重复(可选但推荐) set.seed(123) processed_df <- df %>% # 按ID分组,每个ID单独处理 group_by(ID) %>% # 给每组内的行分配序号(代表时间先后) mutate(row_idx = row_number()) %>% # 随机抽取当前组内的一个行号作为死亡发生的时间点 mutate(death_position = sample(row_idx, size = 1)) %>% # 根据行号和死亡位置的关系设置Status mutate(Status = case_when( row_idx < death_position ~ 0, # 死亡前:存活 row_idx == death_position ~ 1, # 死亡时:标记为1 row_idx > death_position ~ NA_real_ # 死亡后:设为NA )) %>% # 移除辅助列,取消分组 select(-row_idx, -death_position) %>% ungroup() # 查看结果 print(processed_df)
代码解释
group_by(ID):确保每个ID的处理独立进行,不会影响其他ID的数据。row_number():给每个ID对应的行按顺序编号,模拟时间点的先后顺序。sample(row_idx, 1):从当前ID的所有行号中随机选一个,作为死亡发生的时间点,保证每个ID仅出现一次1。case_when():根据行号与死亡位置的关系,分别设置0、1和NA,完全符合需求中的规则。- 最后移除辅助列并取消分组,得到干净的目标数据框。
运行上述代码后,你会得到类似你给出的目标格式的数据(因为随机抽样,每次结果可能略有不同,但核心规则一致)。
内容的提问来源于stack exchange,提问作者Slouei
相关产品推荐
相关产品推荐

