R data.table J行为

时间:2014-05-20 08:23:16

标签: 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

但DT中没有这样的行。为什么我们得到这个结果?

2 个答案:

答案 0 :(得分:5)

data.table J(7, 'f')实际上是您要加入自己的data.table的单行data.table。当您致电x[i]时,您正在查看i中的每一行,并在x中查找所有匹配项。默认设置是NAi中与任何内容不匹配的行,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