R data.table减去一个向量

R data.table减去一个向量,r,data.table,R,Data.table,我有一个data.table,这样说: dt = data.table(param_1 = c(1,3,5), param_2 = c(2,4,6)) dt param_1 param_2 1: 1 2 2: 3 4 3: 5 6 一个常数向量,比如说: s = c(1, 0.5) 我想计算“向量减表”,即s-dt和expect 0 | -1.5 -2 | -3.5 -4 | -5.5 但我明白了 &g

我有一个data.table,这样说:

dt = data.table(param_1 = c(1,3,5), param_2 = c(2,4,6))
dt
       param_1 param_2
1:       1       2
2:       3       4
3:       5       6
一个常数向量,比如说:

s = c(1, 0.5)
我想计算“向量减表”,即s-dt和expect

 0 | -1.5
-2 | -3.5
-4 | -5.5
但我明白了

> s - dt
   param_1 param_2
1:     0.0    -1.5
2:    -2.5    -3.0
3:    -4.0    -5.5
> 
因此,似乎列的顺序是随意切换的(第一行可以,但第二行很奇怪!)。如果
s
是一个命名向量,其名称等于数据表的名称(按正确顺序),也会发生这种情况


如何才能按预期获得表格?

我们可以使用
Map

dt[, Map(`-`, s, .SD)]
或者复制“s”使长度相同,然后从“dt”中减去

s[col(dt)] - dt
请注意,当我们从data.frame或data.table中减去
向量时,减法按列顺序进行,即减去第一列的所有元素,然后转到第二列,依此类推。用一个简单的减法会发生什么

s - dt

“s”的第一个元素从“dt”的第一列、第一行中减去,然后“s”的第二个元素从第一列的第二个元素中减去。由于循环使用,这会与向量重复,并且输出不同

如何在第2行中得到-3.0?@Sotos:你的意思是在R给我的结果中?我认为它符合下面答案中提供的内容,所以它是
-3.5
,也就是说,你做了一个typo@Sotos:不,这不是打字错误(我将还原编辑)。请仔细阅读答案!关于如何解释这个不清楚的操作(向量减去数据表)的约定真的把事情搞混了,3是“正确”的,因为R真的给出了这个结果…哦,对了。我的错。道歉。我认为这是你的预期结果(人们倾向于把它放在最后,因此我一看就立即认为“预期输出”)是有意义的,你的解决方案似乎有效。谢谢:-)