为一行更改一行中的data.table值

时间:2013-10-28 11:07:17

标签: r data.table

我正在尝试更改data.table中特定行的一列值。这在我进行矢量扫描时有效,但在我进行二分查找时则无效。

dtData <- data.table(TickerId = c(1,2,3,4,5), DateTime = c(1,2,3,4,5), Close =     c(100,200,300,400,500), key=c('TickerId', 'DateTime'))
dtQuery <- data.table(TickerId = c(1,4), DateTime = c(1,4))

#Binary search doesn't work - both changed rows now contain 101
dtData[dtQuery, Close:=c(101,401)]

#Vector scan works
dtData[TickerId %in% c(1,4) & DateTime %in% c(1,4), Close:=c(101,401)]

有人能指出为什么会出现这种情况吗?

在大型data.table中改变这样的值的最佳(最快)方法是什么?

谢谢。

3 个答案:

答案 0 :(得分:4)

这有用吗?

dtQuery[,newClose:=c(101,401)]
dtData[dtQuery,Close:=newClose]

如果是这样,它比矢量扫描更好,而不仅仅是因为速度。矢量扫描看起来非常脆弱。有了它,如果你看到一对(4,1)或在(1,1)之前看到(4,4)会发生什么?

答案 1 :(得分:1)

请注意

的不同结果
dtData[dtQuery, Close]
#    TickerId DateTime Close
# 1:        1        1   100
# 2:        4        4   400

dtData[TickerId %in% c(1,4) & DateTime %in% c(1,4), Close]
# [1] 100 400

因此,为了使用二进制搜索,您必须选择关闭列

dtData[dtQuery, ][, Close] 

但是,assignement在复合查询中不起作用。

答案 2 :(得分:1)

受到影子答案的启发,我找到了一种似乎有效的“非复合”方式。首先使用二进制搜索获取行号,然后使用找到的行号更新data.table。

dtIndex <- dtData[dtQuery, .I]
dtData[dtIndex$".I", Close:=c(101,401)]

快速更新有哪些更好的想法?