【问题标题】:How to look for a pattern in data.table column如何在 data.table 列中查找模式
【发布时间】: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


【解决方案1】:

这是一个使用基本 R 函数 anywhich 以及 &amp;&amp; 运算符的 data.table 方法。

fakedata[order(ID, as.POSIXct(Time)),
         .(outcome=any(Event == -1) && Event[which(Event == -1)+1] > 0), by=ID]
   ID outcome
1:  1    TRUE
2:  2    TRUE

正如 david-arenburg 在 cmets 中提到的,在计算之前确保数据集正确排序是一个好主意。对于data.table,我们可以在 i 参数中执行此操作。根据 david-arenburg 的评论,我在 ID 上订购了它,然后在 as.POSIXct(Time) 订购。

在 j 参数中,.(outcome=any(Event==-1) &amp;&amp; Event[which(Event == -1)+1] &gt; 0)any(Event == -1) 检查是否存在 -1,如果是,则 Event[which(Event == -1)+1] &gt; 0) 检查是否在每个存在 -1 的实例中,紧随其后的 Event 值为积极的。如果第一个实例失败,则返回 FALSE。

【讨论】:

  • 我猜你需要确保Time 列也是有序的。
  • 好电话。我会补充的。
  • 我的 data.table 的排序类似于 fakedata[order(ID,Time)]
  • 抱歉,但我不明白 Event[which(Event==1)+1] > 0) 条件...它是否检查 Event 值与 Time>Time 为 -1是阳性吗?
  • 应该读作“紧跟事件的值”。这是通过使用which(Event == -1)+1 索引来找到的。我能想到的两种获得 NA 的方法: 1,您的 Event 变量中有 NA; 2,一个 -1 出现作为一些 ID 的最终观察。
猜你喜欢
  • 1970-01-01
  • 2014-07-09
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多