2014-05-20 14 views
6

sto ancora perplesso dal comportamento di data.table J.R data.table comportamento 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 

ma non esiste tale linea in DT. Perché otteniamo questo risultato?

risposta

5

Il data.table J(7, 'f') è letteralmente una sola riga data.table che si stanno unendo il proprio data.table con. Quando chiami x[i], stai guardando ogni riga in i e trova tutte le corrispondenze per questo in x. Il valore predefinito è di dare NA per le righe in i che non corrispondono nulla, che è più facile visto con l'aggiunta di un'altra colonna a 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 

Quello che state vedendo è l'unica fila in J con alcuna corrispondenza a nulla in DT. Per evitare che data.table di denunciare non-match, è possibile utilizzare nomatch=0

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

Forse aggiungere una colonna aggiuntiva farà luce su quello che sta succedendo.

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 

Questo è lo stesso comportamento come senza J:

setkey(DT, B) 

DT["a"] 
### B A C 
### 1: a 3 3a 

DT["A"] 
### B A C 
### 1: A NA NA 

È possibile utilizzare l'argomento nomatch per modificare questo comportamento.

DT[J(7,"f"), nomatch=0L] 
### Empty data.table (0 rows) of 3 cols: A,B,C 
+3

Forse si potrebbe aggiungere una spiegazione dell'argomento 'nomatch' e come potrebbe essere utilizzato? – BenBarnes