【问题标题】:R rolling join two data.tables with error margin on joinR滚动连接两个data.tables,连接时有误差
【发布时间】:2020-09-24 10:18:26
【问题描述】:

注意:此问题是this one 的副本,但措辞不同,建议使用data.table 而不是dplyr

我有两个数据集,其中包含不同患者在多个测量时刻的得分,如下所示:

dt1 <- data.frame("ID" = c("patient1","patient1","patient1","patient1","patient2","patient3"),
                  "Days" = c(0,10,25,340,100,538),
                  "Score" = c(NA,2,3,99,5,6), 
                  stringsAsFactors = FALSE)
dt2 <- data.frame("ID" = c("patient1","patient1","patient1","patient1","patient2","patient2","patient3"),
                  "Days" = c(0,10,25,353,100,150,503),
                  "Score" = c(1,10,3,4,5,7,6), 
                  stringsAsFactors = FALSE)

> dt1
        ID Days Score
1 patient1    0    NA
2 patient1   10     2
3 patient1   25     3
4 patient1  340    99
5 patient2  100     5
6 patient3  538     6

> dt2
        ID Days Score
1 patient1    0     1
2 patient1   10    10
3 patient1   25     3
4 patient1  353     4
5 patient2  100     5
6 patient2  150     7
7 patient3  503     6

Days 列是时间度量。如果Days 的值在threshold &lt;- 30 之内,我想加入基于IDDays 的两个数据集。有五个条件:

  • 不会合并同一 df(第 1 行和第 2 行)内阈值内的连续天数。
  • 在某些情况下,同一数据框中最多存在四个 Days 变量值,因此不应合并。可能这些值之一确实存在于另一个数据帧的阈值中,并且必须合并这些值(第 4 行)。
  • 不应合并不属于阈值的数据,但也不应丢弃(参见示例输出第 7 行和第 8 行)。
  • 如果任一数据集中Days都没有对应的值,则应填写NA。
  • 数据帧等长!

我怀疑data.table rolling join 可以给我答案,但我似乎无法弄清楚。预期输出如下:

setDT(dt1)
setDT(dt2)
setkey(dt1, ID, Days) ?
setkey(dt2, ID, Days) ?

** do the join **

> dt_joined

        ID Days Score.x Score.y
1 patient1    0      NA       1
2 patient1   10       2      10
3 patient1   25       3       3
4 patient1  353      99       4   <<- merged (days 340 > 353)
5 patient2  100       5       5
6 patient2  150      NA       7   <<- new row added in dt2
7 patient3  503      NA       6   
8 patient3  538       6      NA   <<- same score as row 7 but not within treshold

任何帮助将不胜感激。 data.table 解决方案不是强制性的。

【问题讨论】:

  • dt2 的第三行有Days = 22 时会/应该发生什么?这是dt1 的第 1、2 和 3 行的 30 以内?
  • 它(理想情况下)仍应将两行 3 合并在一起,但在输出表中使用 dt2 Days = 22 的值。如果这不可能,在这种情况下使用最大值Days = 25 也是可以接受的
  • 我在您的其他主题中添加了data.table 解决方案:stackoverflow.com/questions/62066956/…
  • dt1 中有patient1 Days == 340 的得分为994
  • 不应该是 patient3Score.xScore.y 之间翻转的结果吗?

标签: r dataframe join dplyr data.table


【解决方案1】:

用户 Uwe 在这里给出了data.table 的答案:

https://stackoverflow.com/a/62321710/12079387

【讨论】:

    猜你喜欢
    • 2014-05-07
    • 1970-01-01
    • 2019-11-18
    • 2016-10-24
    • 2022-01-09
    • 1970-01-01
    • 2020-09-09
    • 2015-05-18
    • 2011-12-16
    相关资源
    最近更新 更多