【问题标题】:Indexing by multiple criteria between 2 data frames in RR中2个数据帧之间的多个标准索引
【发布时间】:2015-10-24 18:12:39
【问题描述】:

我有以下数据框:

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

我想要的是当一个事件的值为零时,所有事件值都变为 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

有什么帮助吗?

【问题讨论】:

  • 我相信他指的是event

标签: r match aggregate


【解决方案1】:

我们可以使用data.table。将 'data.frame' 转换为 'data.table' (setDT(df1)),按 'id' 分组,if any 的 'event' 为 0 (!event) 对于那个特定的 'id',我们将该组的长度复制 1 (.N-1) 并与 0 或 else 连接以返回“事件”值,分配 (:=) 以更新“事件”列。

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”分组并通过获取复制的逻辑向量的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

【讨论】:

猜你喜欢
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多