更新连接:替换为同名列中的值

Jth*_*rpe 3 join r data.table

我需要将一些数据从一个数据合并data.table到另一个数据中。我知道如何data.table在联接中将新列从一个列添加到另一个列。以下列b中的值df2将添加到df1基于该Id列的联接中:

df1 <- data.table(Id = letters[1:5], a = 1:5)
df2 <- data.table(Id = letters[1:3], a = 7:9, b = 7:9)
setkey(df1, Id)
setkey(df2, Id)
df1[df2, b := b][]
#>    Id a  b
#> 1:  a 1  7
#> 2:  b 2  8
#> 3:  c 3  9
#> 4:  d 4 NA
#> 5:  e 5 NA
Run Code Online (Sandbox Code Playgroud)

df1但是,当列已存在于 中(此处为 列 )时,该习惯用法不起作用a

df1[df2, a := a][]
#>    Id a
#> 1:  a 1
#> 2:  b 2
#> 3:  c 3
#> 4:  d 4
#> 5:  e 5
Run Code Online (Sandbox Code Playgroud)

据我所知,a该作业并未更新该字段,因为该字段a已存在于df1. 赋值a右侧的引用解析为该值,而不是 中的 on df2

那么如何df1$adf2$a匹配时更新连接中的值id以获得以下结果:

#>    Id a
#> 1:  a 7
#> 2:  b 8
#> 3:  c 9
#> 4:  d 4
#> 5:  e 5
Run Code Online (Sandbox Code Playgroud)

jan*_*cki 6

?data.table

i是 data.table 时,可以使用前缀 来i引用的列,例如。这里指的是s 列和s 。ji.X[Y, .(val, i.val)]valXi.val Y

因此,在 的 RHS 中:=,使用i.前缀来引用 ,中a的列df2i.a

library(data.table)
df1 <- data.table(Id = letters[1:5], a = 1:5)
df2 <- data.table(Id = letters[1:3], a = 7:9, b = 7:9)
setkey(df1, Id)
setkey(df2, Id)
df1[df2, a := i.a]

# or instead of setting keys, use `on` argument:
df1[df2, on = .(Id), a := i.a]

df1
#        Id     a
#    <char> <int>
# 1:      a     7
# 2:      b     8
# 3:      c     9
# 4:      d     4
# 5:      e     5
Run Code Online (Sandbox Code Playgroud)