【发布时间】: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 <- 30 之内,我想加入基于ID 和Days 的两个数据集。有五个条件:
- 不会合并同一 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中有patient1Days == 340的得分为99或4? -
不应该是 patient3 在
Score.x和Score.y之间翻转的结果吗?
标签: r dataframe join dplyr data.table