我需要将一些数据从一个数据合并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$a在df2$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)
从?data.table:
当
i是 data.table 时,可以使用前缀 来i引用的列,例如。这里指的是s 列和s 。ji.X[Y, .(val, i.val)]valXi.valY
因此,在 的 RHS 中:=,使用i.前缀来引用 ,中a的列df2:i.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)