R 如何根据组中特定列的结果中的日期范围筛选行

R 如何根据组中特定列的结果中的日期范围筛选行,r,merge,intervals,R,Merge,Intervals,问题 我有四列数据(ID),一个测试完成的日期(TestDT),一列显示感兴趣测试的数值结果(Test1),另一列显示不同感兴趣测试的数值结果(Test2) 期望的结果 我想得到每个ID在测试1的3个月时间内(即之前或之后)发生的任何测试2的平均结果 ID TestDT Test1 Test2 Av_of_test2_within_range 1 2011-03-02 23 NA 34 2 2011-11-22 24 NA 77 3

问题

我有四列数据(ID),一个测试完成的日期(TestDT),一列显示感兴趣测试的数值结果(Test1),另一列显示不同感兴趣测试的数值结果(Test2)

期望的结果

我想得到每个ID在测试1的3个月时间内(即之前或之后)发生的任何测试2的平均结果

ID  TestDT      Test1   Test2 Av_of_test2_within_range
1   2011-03-02  23       NA    34
2   2011-11-22  24       NA    77
3   2009-05-02  15       NA    23
我在尝试筛选在时间范围内发生的Test2结果时遇到困难

尝试

我已尝试使用
tibbletime
软件包中的
filter\u time
,如下所示:

library(tibbletime)
FB <- as_tbl_time(myData, index = TestDT)
FB %>% group_by(ID) %>%filter_time(TestDT ~ TestDT+84)

data.table
具有合并日期范围内两个数据集的
foverlaps
功能

您需要将数据拆分为test1和test2,并执行如下操作:

library(data.table)

df <- read.table(text = "ID  TestDT      Test1   Test2
1   2011-03-02  23       NA
2   2011-03-14  NA       16
2   2011-03-15  NA       52
2   2011-11-22  24       NA
2   2011-12-12  NA       77
3   2009-03-02  NA       23
3   2009-05-02  15       NA
3   2011-12-02  NA       66
4   2017-07-03  NA       22", header = TRUE)

dt <- data.table(df)
dt[, TestDT := as.Date(TestDT)]
test1 <- dt[!is.na(Test1), .(ID, TestDT, Test1)]
test2 <- dt[!is.na(Test2), .(ID, TestDT, Test2)]
test1[, start.date := TestDT - 91]
test1[, end.date := TestDT + 91]
test2[, start.date := TestDT]
test2[, end.date := TestDT]
setkey(test2, ID, start.date, end.date)

res <- foverlaps(
  test1, 
  test2, 
  by.x = c("ID", "start.date", "end.date"),
  by.y = c("ID", "start.date", "end.date")
)

库(data.table)

谢谢@Bulat。我得到了错误:foverlaps中的错误(test1,test2,by.x=c(“ID”,“start.date”),:y键的前3列必须与.y中指定的列相同。@SebastianZeki我已将其更新为工作解决方案。需要在第二个数据集上设置键,请参见与.y的
setkey
名称和顺序匹配的行。感谢@Bulat。这是一个多么有用的函数。感谢illus对它进行分类
Error: Problem with `filter()` input `..1`.
x object 'TestDT' not found
i Input `..1` is `{ ... }`.
The error occured in group 1: 
library(data.table)

df <- read.table(text = "ID  TestDT      Test1   Test2
1   2011-03-02  23       NA
2   2011-03-14  NA       16
2   2011-03-15  NA       52
2   2011-11-22  24       NA
2   2011-12-12  NA       77
3   2009-03-02  NA       23
3   2009-05-02  15       NA
3   2011-12-02  NA       66
4   2017-07-03  NA       22", header = TRUE)

dt <- data.table(df)
dt[, TestDT := as.Date(TestDT)]
test1 <- dt[!is.na(Test1), .(ID, TestDT, Test1)]
test2 <- dt[!is.na(Test2), .(ID, TestDT, Test2)]
test1[, start.date := TestDT - 91]
test1[, end.date := TestDT + 91]
test2[, start.date := TestDT]
test2[, end.date := TestDT]
setkey(test2, ID, start.date, end.date)

res <- foverlaps(
  test1, 
  test2, 
  by.x = c("ID", "start.date", "end.date"),
  by.y = c("ID", "start.date", "end.date")
)