【发布时间】:2020-09-09 14:28:18
【问题描述】:
dt1 对正确序列感兴趣的val
library(data.table)
dt1 <- data.frame(id = 1,
key = c(paste0("a_",1:6),paste0("b_",1:6)),
val = c(122,128,134, rep(NA,3),c(110,112,114),rep(NA,3)),
var = c(rep("a",6),rep("b",6)))
id key val var
1 1 a_1 122 a
2 1 a_2 128 a
3 1 a_3 134 a
4 1 a_4 NA a
5 1 a_5 NA a
6 1 a_6 NA a
7 1 b_1 110 b
8 1 b_2 112 b
9 1 b_3 114 b
10 1 b_4 NA b
11 1 b_5 NA b
12 1 b_6 NA b
dt2 在正确的序列中也有感兴趣的val,但还有一些额外的val
dt2 <- data.frame(id = 1,
key = c(paste0("a_",c(1,3:6)),paste0("b_",c(2,4:6))),
val = c(122,127,122,128,134,110,110,112,114),
var = c(rep("a",5),rep("b",4)))
id key val var
1 1 a_1 122 a
2 1 a_3 127 a
3 1 a_4 122 a
4 1 a_5 128 a
5 1 a_6 134 a
6 1 b_2 110 b
7 1 b_4 110 b
8 1 b_5 112 b
9 1 b_6 114 b
我想将dt2 中的值序列与dt1 中的值序列相匹配,并忽略dt2 中的额外值。
我已经尝试向后滚动连接,因为dt2 中感兴趣的值在序列末尾聚集。
当前尝试:
setDT(dt1,key = c("id","var","val"))
setDT(dt2,key = c("id","var","val"))
dt1[dt2, roll = -Inf]
id key val var i.key
1: 1 a_1 122 a a_1 # wrong
2: 1 a_1 122 a a_4
3: 1 a_2 127 a a_3 # wrong
4: 1 a_2 128 a a_5
5: 1 a_3 134 a a_6
6: 1 b_1 110 b b_2 # wrong
7: 1 b_1 110 b b_4
8: 1 b_2 112 b b_5
9: 1 b_3 114 b b_6
看起来dt2 中的重复值在dt1 但不是 在我正在寻找的序列中导致问题。另外我想保留i.key 以了解原始密钥,因为它将用于其他处理。我也试过:merge(dt1,dt2)
期望的输出:
id key val var i.key
1 a_1 122 a a_4
1 a_2 128 a a_5
1 a_3 134 a a_6
1 b_1 110 b b_4
1 b_2 112 b b_5
1 b_3 114 b b_6
我会很感激一些指导
【问题讨论】:
-
是连续位置的序列吗?例如你认为
dt1中的 c(122,128,134) 与 c(122, 345, 128, 678, 134) 匹配吗? -
dt1中的序列是连续的,因此有效地尝试将c(122,128,134)作为一个序列而不是dt2byid和var中的值逐个值匹配,谢谢 -
是 dt1 中任何特定长度的序列吗?他们被NA包围了吗?对多个 qn 感到抱歉,因为这是一个非常有趣的 qn
-
似乎这个问题与多序列比对有关:stackoverflow.com/questions/4497747/…
-
没问题,dt1 中的序列长度为 2:6,那么 NA 将始终填充为 6,在序列之后从未出现过。因此,在 dt1 中,2 值后面总是跟着 4NA,3 值后面跟着 3NA 等等。
标签: r data.table