2014-05-20 16 views
6

मैं अभी भी data.table जेआर data.table जम्मू व्यवहार

> 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 

के व्यवहार से हैरान हूँ लेकिन वहाँ डीटी में ऐसी कोई रेखा है। हमें यह परिणाम क्यों मिलता है?

उत्तर

5

data.table J(7, 'f') सचमुच एक एकल पंक्ति data.table है कि आप के साथ अपने स्वयं data.table शामिल हो रहे हैं है। जब आप x[i] पर कॉल करते हैं, तो आप i में प्रत्येक पंक्ति को देख रहे हैं और x में इसके लिए सभी मिलान ढूंढ रहे हैं।

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 में केवल पंक्ति है: डिफ़ॉल्ट i में पंक्तियों के लिए NA देने के लिए DT के लिए एक और स्तंभ जोड़कर वह कुछ भी मेल नहीं खाते है, जो आसान देखा जाता है DT में। गैर मैचों रिपोर्टिंग से data.table रोकने के लिए, आप का उपयोग nomatch=0

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

शायद एक अतिरिक्त कॉलम जोड़ना क्या हो रहा है पर कुछ प्रकाश डालेगा।

setkey(DT, B) 

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

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

आप nomatch तर्क का उपयोग कर सकते इस व्यवहार को बदलने के लिए:

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 बिना के रूप में ही व्यवहार है।

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

शायद आप 'nomatch' तर्क का एक विवरण जोड़ सकते हैं कर सकते हैं और यह कैसे किया जा सकता है? – BenBarnes

संबंधित मुद्दे