我仍然对data.table J。
的行为感到困惑> DT = data.table(A=7:3,B=letters[5:1])
> DT
A B
1: 7 e
2: 6 d
3: 5 c
4: 4 b
5: 3 a
> setkey(DT, A, B)
> DT[J(7,"e")]
A B
1: 7 e
> DT[J(7,"f")]
A B
1: 7 f # <- there is no such line in DT
但DT中没有这样的行。为什么我们得到这个结果?
答案 0 :(得分:5)
data.table J(7, 'f')
实际上是您要加入自己的data.table
的单行data.table
。当您致电x[i]
时,您正在查看i
中的每一行,并在x
中查找所有匹配项。默认设置是NA
中i
中与任何内容不匹配的行,DT
可以通过向DT <- data.table(A=7:3,B=letters[5:1],C=letters[1:5])
setkey(DT, A, B)
DT[J(7,"f")]
# A B C
# 1: 7 f NA
添加另一列来更容易看到:
J
您所看到的是DT
中唯一与data.table
中的任何内容都不匹配的行。要阻止nomatch=0
报告不匹配,您可以使用DT[J(7,"f"), nomatch=0]
# Empty data.table (0 rows) of 3 cols: A,B,C
{{1}}
答案 1 :(得分:2)
或许添加一个额外的专栏可以了解正在发生的事情。
DT[, C:=paste0(A, B)]
DT[J(7,"e")]
### A B C
### 1: 7 e 7e
DT[J(7,"f")]
### A B C
### 1: 7 f NA
这与没有J
的行为相同:
setkey(DT, B)
DT["a"]
### B A C
### 1: a 3 3a
DT["A"]
### B A C
### 1: A NA NA
您可以使用nomatch
参数更改此行为。
DT[J(7,"f"), nomatch=0L]
### Empty data.table (0 rows) of 3 cols: A,B,C