问题
I need to merge some data form one data.table into another, and I know I can inject fields from one data.table to another like so:
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
but that idiom does not work when the field already exists in df1
:
df1[df2,a:=a][]
#> Id a
#> 1: a 1
#> 2: b 2
#> 3: c 3
#> 4: d 4
#> 5: e 5
I understand that df1 is unchanged by this assignment because the field a
already exists in
df1
and the reference to a
in the right hand side of the assignment
resolves to that value, not the on in df2
. So how would I go about replacing the
selected values in df1$a
with those in df2$a
to get the following:
#> Id a
#> 1: a 7
#> 2: b 8
#> 3: c 9
#> 4: d 4
#> 5: e 5
回答1:
Use i.
prefix when passing RHS of :=
call.
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)
df1[df2,a:=i.a][]
This is documented in ?data.table
in 1.9.7.
Advanced: When i is a data.table, the columns of i can be referred to in j by using the prefix i., e.g., X[Y, .(val, i.val)]. Here val refers to X's column and i.val Y's.
来源:https://stackoverflow.com/questions/36367293/data-table-replace-existing-value-from-field-with-the-same-name