R 具有data.table联接操作的赋值,多个匹配项

R 具有data.table联接操作的赋值,多个匹配项,r,data.table,R,Data.table,我有两个数据表: dt1 = data.table(a=c('a','b')) dt2 = data.table(a=c('a','b','b')) 合并dt1[dt2,on='a'] a 1: a 2: b 3: b 因此,当我执行操作dt1[dt2,on='a',c:=1]时,我期望 a c 1: a 1 2: b 1 3: b 1 但是我得到了 a c 1: a 1 2: b 1 为什么会这样?我们需要使用 dt2[dt1, c := 1, on = "a"] d

我有两个数据表:

dt1 = data.table(a=c('a','b'))
dt2 = data.table(a=c('a','b','b'))
合并
dt1[dt2,on='a']

   a
1: a
2: b
3: b
因此,当我执行操作
dt1[dt2,on='a',c:=1]
时,我期望

   a c
1: a 1
2: b 1
3: b 1
但是我得到了

   a c
1: a 1
2: b 1
为什么会这样?

我们需要使用

dt2[dt1, c := 1, on = "a"]
dt2
#   a c
#1: a 1
#2: b 1
#3: b 1
如果我们对更改初始数据集“dt1”不感兴趣,那么

dt1[dt2, c(.SD, c= 1), on = 'a']
#   a c
#1: a 1
#2: b 1
#3: b 1

OP方法中的问题是,在联接之后,赋值(
:=
)发生在第一个数据集(“dt1”)中,它只有2行,因此,赋值也将在这2行而不是3行中。一个选项是将其分配给第二个数据集(如第一个方法所示),或者通过连接新列“c”来创建一个新数据集。

我们需要使用

dt2[dt1, c := 1, on = "a"]
dt2
#   a c
#1: a 1
#2: b 1
#3: b 1
如果我们对更改初始数据集“dt1”不感兴趣,那么

dt1[dt2, c(.SD, c= 1), on = 'a']
#   a c
#1: a 1
#2: b 1
#3: b 1


OP方法中的问题是,在联接之后,赋值(
:=
)发生在第一个数据集(“dt1”)中,它只有2行,因此,赋值也将在这2行而不是3行中。一个选项是将其分配给第二个数据集(如第一个方法所示),或者我们通过连接一个新列“c”来创建一个新的数据集。

您说的是“在连接之后”,但听起来好像分配发生在连接之前——是吗?@siralen它基于连接,例如,
a1您说的是“在连接之后”,但听起来赋值发生在连接之前——对吗?@siralen它是基于连接的,例如
a1