R data.table J行为

tuc*_*son 6 r data.table

我仍然对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
Run Code Online (Sandbox Code Playgroud)

但DT中没有这样的界限.为什么我们得到这个结果?

Mat*_*eck 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
Run Code Online (Sandbox Code Playgroud)

你所看到的是唯一一条J与之无关的东西DT.为防止data.table报告不匹配,您可以使用nomatch=0

DT[J(7,"f"), nomatch=0]
# Empty data.table (0 rows) of 3 cols: A,B,C
Run Code Online (Sandbox Code Playgroud)