2

我有一个如下的数据框。每个记录在不同的时间点StatusID0 表示该人还活着,1 表示该人已死亡。

ID   Status
1    0
1    0
1    1
2    0
2    0
2    0
3    0
3    0
3    0
3    1

我想对列进行洗牌Status,每个 ID 的状态都可以为 1,只有一次。之后,我想拥有NA其他行。例如,我希望我的数据框在改组后如下所示:

ID   Status
1    0
1    0
1    0
2    0
2    1
2    NA
3    0
3    1
3    NA
3    NA
4

2 回答 2

3

从您发布的数据和示例输出来看,您似乎想要随机抽样df$Status然后进行替换。要在一个步骤中获得您想要的,您可以执行以下操作:

set.seed(3)
df$Status <- ave(sample(df$Status), df$ID, FUN = function(x) replace(x, which(cumsum(x)>=1)[-1], NA))

df
# ID Status
#1   1      0
#2   1      0
#3   1      0
#4   2      1
#5   2     NA
#6   2     NA
#7   3      0
#8   3      0
#9   3      1
#10  3     NA
于 2018-03-28T21:29:29.140 回答
2

一个cumsum用于cumsum决定首先1出现在ID.

请注意,我已经修改了 OP 的示例数据框以表示重新洗牌的逻辑。

library(dplyr)
df %>% group_by(ID) %>% 
  mutate(Sum = cumsum(cumsum(Status))) %>%
  mutate(Status = ifelse(Sum > 1, NA, Status)) %>%
  select(-Sum)
# # A tibble: 10 x 2
# # Groups: ID [3]
# ID Status
# <int>  <int>
# 1     1      0
# 2     1      0
# 3     1      1
# 4     2      0
# 5     2      1
# 6     2     NA
# 7     3      0
# 8     3      1
# 9     3     NA
# 10    3     NA

数据

df <- read.table(text = 
"ID   Status
1    0
1    0
1    1
2    0
2    1
2    0
3    0
3    1
3    0
3    0", header = TRUE)
于 2018-03-28T21:32:13.503 回答