我有以下数据框:
id day event
1 1 1
1 3 1
2 1 0
2 4 0
2 9 0
2 15 0
3 2 0
3 5 0
4 1 1
4 8 1
4 11 1
我想要的是当一个事件的值为零时,所有事件值除了最后一个(按日期)之外变为一个。所以输出应该如下:
id day event
1 1 1
1 3 1
2 1 1
2 4 1
2 9 1
2 15 0
3 2 1
3 5 0
4 1 1
4 8 1
4 11 1
任何帮助?
答案 0 :(得分:2)
我们可以使用data.table
。转换' data.frame'到' data.table' (setDT(df1)
),按照' id',if
any
对事件进行分组'该特定' id'为0(!event
),我们为该组的长度-1(.N-1
)复制1并与0或else
连接返回'事件'值,指定(:=
)来更新“事件”#39;列。
library(data.table)
setDT(df1)[, event :=if(any(!event)) c(rep(1L, .N-1),0L) else event, by = id]
df1
# id day event
# 1: 1 1 1
# 2: 1 3 1
# 3: 2 1 1
# 4: 2 4 1
# 5: 2 9 1
# 6: 2 15 0
# 7: 3 2 1
# 8: 3 5 0
# 9: 4 1 1
#10: 4 8 1
#11: 4 11 1
或使用dplyr
,我们按“ID&ID”分组。并改变“事件”#39;列通过获取复制的逻辑向量的lead
并添加另一个逻辑向量(all(event)
)。
library(dplyr)
df1 %>%
group_by(id) %>%
mutate(event= lead(rep(any(!event), n()), default=0) + all(event))
# id day event
# (int) (int) (dbl)
#1 1 1 1
#2 1 3 1
#3 2 1 1
#4 2 4 1
#5 2 9 1
#6 2 15 0
#7 3 2 1
#8 3 5 0
#9 4 1 1
#10 4 8 1
#11 4 11 1