data.table: replace existing value from field with the same name

你说的曾经没有我的故事 提交于 2019-12-13 18:38:08

问题


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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!