为什么使用二进制搜索在数据表连接中不会发生条件赋值?

时间:2014-10-25 21:24:19

标签: r data.table

如果某些条件成立,我想分配给数据表的列。它在使用矢量扫描时发生,但在使用二进制搜索时不发生。你能解释一下这个原因吗?

dt['1291703']$test = 'ali'
# Error in `[<-.data.table`(`*tmp*`, "1291703", value = list(filename =
# "1291703",  :         i[1] is NA. Can't assign by reference to row 'NA'.

dt[cik=='1291703']$test = 'ali'
dt[cik=='1291703']
##                filename     cik signatureDate test
## 1: 0000919574-09-007207 1291703    2009-03-12  ali
## 2: 0000919574-09-007310 1291703    2009-03-19  ali

1 个答案:

答案 0 :(得分:0)

如果没有其他信息,您的二进制搜索尝试的问题似乎是您尝试将ali列分配到行号temp上的1291703列,这可能不会存在。

在二进制搜索中,首先应该记住按要搜索的列键入数据集。要理解的第二件事是,当您将整数传递给i时,它是默认情况下搜索该行号,因此您应该使用J()(或版本1.9.4+中的.())。

您还应该使用:=代替$,以便通过引用进行分配。因此,解决方案看起来应该是这样的:

setkey(dt, cik)[J(1291703), test := 'ali']
dt
#                filename     cik signatureDate test
# 1: 0000919574-09-007207 1291703    2009-03-12  ali
# 2: 0000919574-09-007310 1291703    2009-03-19  ali

如果cik属于character类(从您的问题中不清楚),以下内容也应该有效

dt[, test := NULL] # Removing `test` for illustration
dt[, cik := as.character(cik)] # Converting `cik` to class `character`, also for illustration
setkey(dt, cik)['1291703', test := 'ali'] # Implementing binary search without using `J()`
dt
#                filename     cik signatureDate test
# 1: 0000919574-09-007207 1291703    2009-03-12  ali
# 2: 0000919574-09-007310 1291703    2009-03-19  ali