2017-07-03 17 views
5

मैं यह पता लगाने की है जब मैं R में data.table package में अनुक्रमण का उपयोग कैसे मैं logical operators प्रदर्शन कर सकते हैं कोशिश कर रहा हूँ?आर पर डेटाटेबल में अनुक्रमण के माध्यम से लॉजिकल ऑपरेटरों को कैसे करें?

उदाहरण निम्नलिखित है। मैं datatable को dt के रूप में नामित करता हूं। तो अब मैं में मेरी पहले से ही key (var2) जो less than 10 (<10) हैं परिभाषित सभी मूल्यों की पहचान करना चाहते

> dt = data.table(var1 = rep(LETTERS[1:5],2), var2 = seq(1,20, 2), var3 = ceiling(rnorm(10, 3, 2))) 
> dt 
    var1 var2 var3 
1: A 1 5 
2: B 3 3 
3: C 5 0 
4: D 7 6 
5: E 9 3 
6: A 11 4 
7: B 13 2 
8: C 15 1 
9: D 17 3 
10: E 19 7 

> setkey(dt, var2) 

: और फिर मेरी datatable में कुंजी के रूप में var2 बनाते हैं। निम्नलिखित प्रयासों को करने से मुझे errors दें।

> dt[ < 10] 
Error: unexpected '<' in "dt[ <" 
> dt[ .< 10] 
Error in eval(expr, envir, enclos) : object '.' not found 
> dt[ .(< 10)] 

मेरी उम्मीद होगा:

 var1 var2 var3 

1: A 11 4 
2: B 13 2 
3: C 15 1 
4: D 17 3 
5: E 19 7 

Btw, मुझे पता है कि सिर्फ करके मैं परिणाम मिल जाएगा। लेकिन कृपया ध्यान दें कि मैं data.table में इंडेक्सिंग की अवधारणा प्राप्त करना चाहता हूं और समझता हूं और जानता हूं कि key(var2) को मेरे प्रत्येक आदेश में कॉल किए बिना इसे कैसे किया जाए!

स्पष्टीकरण के साथ कोई भी सहायता अत्यधिक सराहना की जाती है।

+1

'डीटी [var2 <10]'?स्पष्टीकरण के साथ आपको 10 से कम होने के लिए * कुछ * निर्दिष्ट करने की आवश्यकता है? – Gregor

+1

@ ग्रेगोर, मुझे यह पता है और यह बहुत स्पष्ट है! लेकिन अनुक्रमण की अवधारणा यह है कि मुझे हर बार कॉलम नाम (कुंजी) कॉल करने की आवश्यकता नहीं है। तो, मैं अपने आदेश में 'var2' को कॉल किए बिना इसे कैसे कर सकता हूं? – Daniel

+1

'? Setkey' या'? Key' से ऐसा लगता है कि आप कुंजी प्राप्त करने के लिए तालिका पर 'कुंजी()' को कॉल कर सकते हैं, इसलिए 'dt [dt [[key (dt)]] <10] 'इसके लिए काम करता है । आप यह भी कहने के लिए प्रश्न संपादित करना चाहेंगे कि आप इसे अपने आदेश में 'var2'' कॉल किए बिना प्रोग्रामेटिक रूप से करना चाहते हैं। – Gregor

उत्तर

3
?setkey से

, key(dt) एक चरित्र में महत्वपूर्ण स्तंभों मिल वेक्टर। अपनी मेज एक भी कुंजी स्तंभ मानते हुए है, तो आप प्राप्त कर सकते हैं क्या आप के साथ हैं:

dt[dt[[key(dt)]] < 10] 

डेविड Arenburg लिए धन्यवाद, आप भी get() उपयोग कर सकते हैं:

dt[get(key(dt)) < 10] 

यह एक छोटा सा कम है और शायद जाने का रास्ता।

अन्य तरीके से मैं यह करने के बारे में सोच सकते बहुत खराब है:

dt[eval(parse(text = paste(key(dt), "< 10")))] 
+3

को अपडेट करेगा 'डीटी [प्राप्त करें (कुंजी (डीटी)) <10] 'और' डीटी [eval (as.name (key (dt))) <10] ' –

1
प्रलेखन https://www.rdocumentation.org/packages/data.table/versions/1.10.4/topics/setkey

यहाँ से

, समाधान के लिए एक महत्वपूर्ण है यदि संभव हो तो

> library(data.table) 
data.table 1.10.4 
    The fastest way to learn (by data.table authors): https://www.datacamp.com/courses/data-analysis-the-data-table-way 
    Documentation: ?data.table, example(data.table) and browseVignettes("data.table") 
    Release notes, videos and slides: http://r-datatable.com 
> data(mtcars) 
> head(mtcars) 
        mpg cyl disp hp drat wt qsec vs am gear carb 
Mazda RX4   21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 
Mazda RX4 Wag  21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 
Datsun 710  22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 
Valiant   18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 

> mtcars=data.table(mtcars) 
> setkey(mtcars,mpg) 
> key(mtcars) 
[1] "mpg" 


> mtcars[mpg<15,,] 
    mpg cyl disp hp drat wt qsec vs am gear carb 
1: 10.4 8 472 205 2.93 5.250 17.98 0 0 3 4 
2: 10.4 8 460 215 3.00 5.424 17.82 0 0 3 4 
3: 13.3 8 350 245 3.73 3.840 15.41 0 0 3 4 
4: 14.3 8 360 245 3.21 3.570 15.84 0 0 3 4 
5: 14.7 8 440 230 3.23 5.345 17.42 0 0 3 4 
> mtcars["mpg"<15,,] 
Empty data.table (0 rows) of 11 cols: mpg,cyl,disp,hp,drat,wt... 

समस्या निहित है कि कुंजी (डीटी) "var2" दे रहा है, जबकि एक datatable मांगों var2 में सबसेट (उद्धरण के बिना) - हम इस get

का उपयोग कर पाने के तो अब Remove quotes from a character vector in R

का उपयोग कर इस भोला आदमी है जिस तरह से

#get(key(mtcars)) 

    > mtcars[get(key(mtcars))<15] 
    mpg cyl disp hp drat wt qsec vs am gear carb 
1: 10.4 8 472 205 2.93 5.250 17.98 0 0 3 4 
2: 10.4 8 460 215 3.00 5.424 17.82 0 0 3 4 
3: 13.3 8 350 245 3.73 3.840 15.41 0 0 3 4 
4: 14.3 8 360 245 3.21 3.570 15.84 0 0 3 4 
5: 14.7 8 440 230 3.23 5.345 17.42 0 0 3 4 

अपने datatable के लिए ऐसा न हो कि यह हो जाएगा

DT[get(key(DT))<10] 

जो @DavidArenburg की सरल और सुरुचिपूर्ण जवाब के रूप में एक ही है

+1

मुझे डर नहीं है! – Daniel

+1

क्या आपने अपना उत्तर भी परीक्षण किया था? –

+0

मैं अपने जवाब का परीक्षण नहीं कर सकता। मैं कार्यालय में हूं और आर –

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