基于2个值联接数据表

时间:2020-10-20 20:26:53

标签: r data.table

我有以下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)。

2 个答案:

答案 0 :(得分:2)

您可以使用roll = "nearest"来加入dt1dt2

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
相关问题