在R中的2个数据帧之间按多个标准索引

时间:2015-10-24 18:12:39

标签: r match aggregate

我有以下数据框:

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

任何帮助?

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