【问题标题】:R: Subset data table in a period of days according to several starting indicesR:根据几个起始索引在几天内的子集数据表
【发布时间】:2015-08-02 13:53:58
【问题描述】:

为标题不当道歉。

我有这样的数据:

DT <- data.table(date=as.Date(c("2013-07-02","2013-08-03","2013-09-04","2013-10-05","2013-11-06")), 
                 user =c(rep('A',5),rep('B',5),rep('C',5),rep('D',5),rep('E',5)), 
                 type =as.factor(letters[26:22]), val = runif(25))

以及它的一个子集,例如,dt = DT[c(2,8,12,18,21)] 源自某些条件。

我想根据date 中的dt 进一步从DT 获得另一个子集。 例如,在 dt 的每一行中使用 date 作为开始日期,使用 60 天后作为结束日期,结果如下子集:

2: 2013-08-03    A    y 0.1049906
3: 2013-09-04    A    x 0.5823697
8: 2013-09-04    B    x 0.6254128
9: 2013-10-05    B    w 0.3616622
12: 2013-08-03    C    y 0.7924443
13: 2013-09-04    C    x 0.3651911
18: 2013-09-04    D    x 0.9989626
19: 2013-10-05    D    w 0.9782797
21: 2013-07-02    E    z 0.9337487
22: 2013-08-03    E    y 0.3784970

所需的输出可以是上面的一个或一个用户列表,在本例中,每个用户包含两行。

【问题讨论】:

  • 这是否意味着您需要其他子集而不是另一个子集?对于 dt 中的每个日期,您需要从 DT 获取一个数据框 ??。还是我错过了什么?
  • 是的,正如我在上一句中提到的,替代的期望输出可以是数据帧列表,其第一行是构成dt 的那些。帖子中所需的输出只是数据帧列表的串联。

标签: r date data.table subset indices


【解决方案1】:

foverlaps 功能非常明确。

   library(data.table)

#create dummy end day for DT & real end day for dt
DT[,dateend := date]
dt[, dateend := date + 60]

#set the keys making sure dates are last 2
setkey(DT, user, date, dateend)
setkey(dt, user, date ,dateend)

#run foverlaps removing non matches then subsetting back to orig columns
subdt <- foverlaps(dt,DT, nomatch = 0)[,.(date, user, type, val)]

> subdt
          date user type       val
 1: 2013-08-03    A    y 0.9003246
 2: 2013-09-04    A    x 0.6521185
 3: 2013-09-04    B    x 0.9619138
 4: 2013-10-05    B    w 0.4214740
 5: 2013-08-03    C    y 0.1986591
 6: 2013-09-04    C    x 0.3056523
 7: 2013-09-04    D    x 0.7323238
 8: 2013-10-05    D    w 0.2416779
 9: 2013-08-02    E    z 0.4672380
10: 2013-08-03    E    y 0.6618275
11: 2013-09-04    E    x 0.5488879

【讨论】:

  • 我试过你的代码,subdt 看起来不像 OP 显示的预期输出
  • 你是对的@Akrun,我在 foverlaps 功能中颠倒了 dt 和 DT。我已经编辑,现在的输出符合 OP 的预期
  • 我使用DT &lt;- data.table(date=as.Date(c("2013-08-02","2013-08-03","2013-09-04","2013-10-05","2013-11-06")), user =c(rep('A',5),rep('B',5),rep('C',5),rep('D',5),rep('E',5)), type =as.factor(letters[26:22]), val = runif(25))测试了代码,将第一个日期替换为2013-08-02subdt错误地为以2013-08-03开头的用户A、C和E抓取了它,怎么可能修好了吗?
  • @Fredom 看看编辑。 DT 的开始日期和结束日期现在都相同了。当使用 'any' 参数作为匹配类型(默认)时,foverlaps 函数实际上可以很好地处理 0 天期间(在 y 中)。由于 foverlaps 仍处于“建设中”,如果此代码仍需要在一年内运行,您将需要指定继续前进。 E 从“2013-08-02”开始,仍然被拾取 3 次。
猜你喜欢
  • 2022-06-24
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 2015-04-04
  • 2020-05-07
  • 2021-08-03
  • 1970-01-01
  • 2022-08-19
相关资源
最近更新 更多