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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:44:59