【发布时间】:2017-02-13 16:33:15
【问题描述】:
我有一个 data.table 像:
ID Time Event
1: 1 2016-09-25 14:47:52 1
2: 1 2016-10-03 19:35:04 1
3: 1 2016-10-03 21:11:00 -1
4: 1 2016-10-04 14:25:56 1
5: 1 2016-11-05 01:40:13 1
6: 1 2016-11-27 04:40:21 1
7: 1 2016-12-04 02:36:37 1
8: 1 2017-01-12 13:48:01 1
9: 1 2017-01-15 03:32:35 1
10: 1 2017-02-05 01:35:07 1
11: 1 2017-02-05 02:29:31 1
12: 1 2017-02-05 02:34:33 1
13: 2 2016-07-15 08:14:11 1
14: 2 2016-07-22 22:15:44 1
15: 2 2016-07-23 12:00:00 -1
16: 2 2016-11-30 18:21:51 1
17: 2 2016-12-03 07:00:31 1
18: 2 2016-12-06 06:30:34 1
19: 2 2016-12-16 10:00:50 1
20: 2 2017-01-16 08:33:16 1
我正在尝试检查积极事件是否发生在按 ID 分组的消极事件之后。我的理想输出是一个 data.table,其中包含:
ID Outcome
1 TRUE
2 TRUE
我不知道如何制定应考虑时间列和事件列的过滤条件:我想知道对于给定的 ID,是否有 Event = 1 且 Time > Time at Event - 1...但是我无法在代码中制定这个...有人可以帮忙吗?
我在这里附上一个演示数据集:
fakedata <- structure(list(ID = c(1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 2L,
2L, 2L, 2L, 2L, 2L,
2L, 2L), Time = c("2016-09-25 14:47:52", "2016-10-03 19:35:04",
"2016-10-03 21:11:00", "2016-10-04 14:25:56", "2016-11-05 01:40:13",
"2016-11-27 04:40:21", "2016-12-04 02:36:37", "2017-01-12 13:48:01",
"2017-01-15 03:32:35", "2017-02-05 01:35:07", "2017-02-05 02:29:31",
"2017-02-05 02:34:33", "2016-07-15 08:14:11", "2016-07-22 22:15:44",
"2016-07-23 12:00:00", "2016-11-30 18:21:51", "2016-12-03 07:00:31",
"2016-12-06 06:30:34", "2016-12-16 10:00:50", "2017-01-16 08:33:16"
), Event = c(1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1,
1, 1, 1, 1)), .Names = c("ID", "Time", "Event"), class = c("data.table",
"data.frame"), row.names = c(NA, -20L))
【问题讨论】:
-
sapply(split(fakedata,fakedata$ID), function(x) is.na(which(diff(x$Event) == 2)) == FALSE) -
谢谢,我看到它有效,但它看起来不像一个合适的 data.table 解决方案
-
可以
fakedata[order(as.POSIXct(Time)), any(Event - shift(Event, fill = 0) == 2), keyby = ID]
标签: r data.table