R 对联接的data.table子集的计算抛出警告,但结果是否正确?

R 对联接的data.table子集的计算抛出警告,但结果是否正确?,r,join,data.table,R,Join,Data.table,我想从表dt中的匹配行中减去dt\u false表中的值。结果是正确的,尽管我想知道为什么会出现警告 library(data.table) dt <- data.table(id = letters[1:15], value = 1:15, key = "id") dt_false <- data.table(id = letters[6:20], v

我想从表
dt
中的匹配行中减去
dt\u false
表中的值。结果是正确的,尽管我想知道为什么会出现警告

library(data.table)
dt <- data.table(id    = letters[1:15],
                 value = 1:15,
                 key   = "id")

dt_false <- data.table(id    = letters[6:20],
                       value = 6:20,
                       key   = "id")

# matching subset
dt[dt_false, nomatch=0]

# use nomatch = 0 to include only the matches
# use i.v1 to reference v1 from the i component
dt[dt_false, nomatch=0, value := value - i.value, ]

Warning message:
In `[.data.table`(dt, dt_false, `:=`(value, value - i.value), nomatch = 0) :
  Supplied 10 items to be assigned to 15 items of column 'value' (recycled leaving remainder of 5 items).
库(data.table)

dt删除
nomatch=0
参数,因为所有不匹配的内容都不会被更新。只需执行
dt[dt_false,value:=value-i.value]
在我看来,您的预期行为(毫无怨言地分配到所选子集)就是应该发生的。如果您使用
6:30
而不是
6:20
,则该警告更容易解析,在这种情况下,它会显示“提供10个项目以分配给25个项目”,这听起来像是分配给
dt_false
(其中有25个项目)…奇怪。也许这就像大卫说的那样,合并赋值应该是普通的,
DT1[DT2,var:=stuff]
(没有
nomatch
)。@DavidArenburg把你的评论作为答案,这样问题就可以解决了。@jangorecki我还没有调查
nomatch
为什么会有这种效果,因此也没有发布答案。因为这才是真正的问题。