Ale*_*lex 7 merge r data.table
这可能是一个错误.在这种情况下,我将删除此问题并报告为错误.我希望有人看一看,确保我没有做错事,所以我不浪费开发时间.
test = data.table(mo=1:100, b=100:1, key=c("mo", "b"))
mo = 1
test[J(mo)]
Run Code Online (Sandbox Code Playgroud)
这将返回整个testdata.table而不是返回的正确结果
test[J(1)]
Run Code Online (Sandbox Code Playgroud)
我相信错误可能来自与test正在加入的表具有相同的列名,mo.有没有其他人得到同样的问题?
这是一个范围问题,类似于data.table-faq 2.13(警告,pdf)中讨论的问题.因为test包含一个名为column的列mo,所以当J(mo)它被计算时,它将返回整个列,而不是mo它掩盖的全局环境中找到的值.(当你想做类似的事情时,这种范围行为当然非常好test[mo<4]!)
试试看看发生了什么:
test <- data.table(mo=1:5, b=5:1, key=c("mo", "b"))
mo <- 1
test[browser()]
Browse[1]> J(mo)
# mo
# 1: 1
# 2: 2
# 3: 3
# 4: 4
# 5: 5
# Browse[1]>
Run Code Online (Sandbox Code Playgroud)
正如链接的FAQ中所建议的,一个简单的解决方案是重命名索引变量:
MO <- 1
test[J(MO)]
# mo b
# 1: 1 6
Run Code Online (Sandbox Code Playgroud)
(这也将工作,为的文件中讨论的原因i中?data.table):
mo <- data.table(1)
test[mo]
# mo b
# 1: 1 6
Run Code Online (Sandbox Code Playgroud)