2014-05-20 18 views
6

Ich bin immer noch durch das Verhalten von data.table J.R data.table J Verhalten

verwirrt
> 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 

aber es gibt keine solche Linie in DT. Warum bekommen wir dieses Ergebnis?

Antwort

5

Die data.table J(7, 'f') ist buchstäblich eine einreihige data.table dass Sie Ihre eigenen data.table mit beitreten. Wenn Sie x[i] anrufen, sehen Sie sich jede Zeile in i an und finden alle Übereinstimmungen dafür in x. Die Standardeinstellung ist NA für die Zeilen in i zu geben, dass nichts übereinstimmen, die leichter durch das Hinzufügen eines weiteren Spalte zu DT zu sehen ist:

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 

Was Sie ist die einzige Zeile in J ohne Spiel zu etwas sehen in DT. Um zu verhindern, data.table von der Berichterstattung nicht-Matches können Sie nomatch=0

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

Wenn Sie eine zusätzliche Spalte hinzufügen, können Sie sich ein Bild davon machen, was gerade passiert.

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 

Dies ist das gleiche Verhalten wie ohne J:

setkey(DT, B) 

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

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

können Sie das nomatch Argument verwenden, dieses Verhalten zu ändern.

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

verwenden Vielleicht könnten Sie eine Erklärung für das 'nomatch' Argument hinzufügen und wie könnte es verwendet werden? – BenBarnes

Verwandte Themen