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