我有以下2个数据表:
dt1 <- data.table(type1 = c('A','A','A','B','B', 'B', 'B'),
type2 = c('K','K','I','K','I', 'K', 'I'),
value = c(0,1,2,3,4,5,7,9))
dt2 <- data.table(type1 = c('A','A','B','B','B','A','A','B','B','A'),
value = c(0.3,2.6,5.5,9,2.4,1.1,4,5.1,6.7,3.2))
> dt1
type1 type2 value
1: A K 0
2: A K 1
3: A I 2
4: B K 3
5: B I 4
6: B K 5
7: B I 7
8: A K 9
> dt2
type1 value
1: A 0.3
2: A 2.6
3: B 5.5
4: B 9.0
5: B 2.4
6: A 1.1
7: A 4.0
8: B 5.1
9: B 6.7
10: A 3.2
我希望能够基于type1列和dt1中的值(最近值)加入dt2上的type2列,结果是:
type1 type2 value
1: A K 0.3
2: A I 2.6
3: B K 5.5
4: B I 9.0
5: B K 2.4
6: A K 1.1
7: A I 4.0
8: B K 5.1
9: B I 6.7
10: A I 3.2
例如,对于第一行,它从dt1获得type2,其中type1 ==“ A”和value == 0(最接近0.3)。
答案 0 :(得分:2)
您可以使用roll = "nearest"
来加入dt1
和dt2
:
library(data.table)
setkey(dt1, type1, value)
setkey(dt2, type1, value)
dt1[dt2, roll = "nearest"]
输出
type1 type2 value
1: A K 0.3
2: A K 1.1
3: A I 2.6
4: A I 3.2
5: A I 4.0
6: B K 2.4
7: B K 5.1
8: B K 5.5
9: B I 6.7
10: B I 9.0
答案 1 :(得分:1)
用于.EACHI
dt2[, type2 := dt1[dt2, .SD[which.min(abs(value-i.value))],
on = 'type1', by = .EACHI][, type2]]
dt2[]
#> type1 value type2
#> 1: A 0.3 K
#> 2: A 2.6 I
#> 3: B 5.5 K
#> 4: B 9.0 I
#> 5: B 2.4 K
#> 6: A 1.1 K
#> 7: A 4.0 I
#> 8: B 5.1 K
#> 9: B 6.7 I
#> 10: A 3.2 I