अपने सांख्यिक सूचकांकों द्वारा data.table में कई कॉलम चुनें


143

हम अपने सांख्यिक सूचकांकों (स्थिति) के वेक्टर का उपयोग करके कई कॉलमों का चयन कैसे कर सकते हैं data.table?

यह हम कैसे एक के साथ होगा data.frame:

df <- data.frame(a = 1, b = 2, c = 3)
df[ , 2:3]
#   b c
# 1 2 3

जवाबों:


185

Data.table के संस्करणों के लिए >= 1.9.8, निम्नलिखित सभी काम:

library(data.table)
dt <- data.table(a = 1, b = 2, c = 3)

# select single column by index
dt[, 2]
#    b
# 1: 2

# select multiple columns by index
dt[, 2:3]
#    b c
# 1: 2 3

# select single column by name
dt[, "a"]
#    a
# 1: 1

# select multiple columns by name
dt[, c("a", "b")]
#    a b
# 1: 1 2

Data.table के संस्करणों के < 1.9.8लिए (जिसके लिए संख्यात्मक स्तंभ चयन के उपयोग की आवश्यकता होती है with = FALSE), इस उत्तर के पिछले संस्करण को देखें । V1.9.8 पर समाचार भी देखें , संभावित रूप से ब्रेकिंग चैनल, बिंदु 3।


1
कोई दिक्कत नहीं है। तुलना भी करें dt[,"a"]और dt[,"a", with=FALSE]देखें कि वास्तव में यह एक सहायक विकल्प क्या है।
जोश ओ'ब्रायन

3
किसी भी तरह के साथ ऐसा करने के लिए? उदाहरण के लिए DT[,list(b:c), जैसा कि मैंने डेटा तालिका में स्तंभों को सीधे रूप में बदलना सुविधाजनक पाया, जैसे मैं कर सकता हूं DT[,list(1/b,2*c)], लेकिन यह साथ काम नहीं करता है।
जम्बोर्ता

2
पैकेज में परिवर्तन with=FALSEइस मामले में अनावश्यक बना देगा : github.com/Rdatatable/data.table/issues/…
फ्रैंक

1
@ फ्रांक - यह बहुत अच्छी खबर है! इसे मेरे संज्ञान में लाने के लिए धन्यवाद। एक बार जब वह परिवर्तन डेटा के संस्करण में अपना रास्ता बना लेता है। CRAN पर वितरित किए जा रहे हैं, तो मैं इस उत्तर को बदलाव की घोषणा करने के लिए संपादित करूँगा। (और कृपया - आप या कोई और जो इसे पढ़ता है - जैसे ही ऐसा होता है मुझे एक अनुस्मारक के साथ पिंग करने के लिए स्वतंत्र महसूस करें।)
जोश ओ'ब्रायन

2
@Valentas मजेदार आपको पूछना चाहिए। data.frameउपयोग करने के लिए कोई संगत तरीका नहीं है with=FALSE। हालांकि, 3 के बारे में हफ्ते पहले के रूप में, के विकास के संस्करण data.table की तरह कॉल करने के लिए संशोधित किया गया है dt[, 2], dt[, 2:3], dt[, "b"], और dt[, c("b", "c")]एक ही व्यवहार करते हैं जैसा कि वे साथ में क्या data.frameरों बिना स्पष्ट रूप से सेट करने के लिए with=FALSE। यह ज़बरदस्त है! परिवर्तन का वर्णन करते हुए NEWS प्रविष्टि सहित विशेष प्रतिबद्धता के लिए यहाँ देखें
जोश ओ'ब्रायन

43

यह थोड़ा वर्बोज़ है, लेकिन मैंने छिपे हुए .SDचर का उपयोग करने के लिए उपयोग किया है ।

b<-data.table(a=1,b=2,c=3,d=4)
b[,.SD,.SDcols=c(1:2)]

यह एक परेशानी का एक सा है, लेकिन आप अन्य data.table सुविधाओं (मुझे नहीं लगता) पर बाहर खोना नहीं है, तो आप अभी भी अन्य महत्वपूर्ण कार्यों जैसे कि तालिकाओं आदि का उपयोग करने में सक्षम होना चाहिए।


6
एक परेशानी और बहुत उपयोगी नहीं है जब स्तंभ सूची को प्रोग्रामेटिक रूप से बनाते हैं
क्रिस

39

यदि आप कॉलम का चयन करने के लिए कॉलम नामों का उपयोग करना चाहते हैं, तो बस उपयोग करें .(), जो इसके लिए एक उपनाम है list():

library(data.table)
dt <- data.table(a = 1:2, b = 2:3, c = 3:4)
dt[ , .(b, c)] # select the columns b and c
# Result:
#    b c
# 1: 2 3
# 2: 3 4

19

V1.10.2 के बाद से, आप भी उपयोग कर सकते हैं ..

dt <- data.table(a=1:2, b=2:3, c=3:4)

keep_cols = c("a", "c")

dt[, ..keep_cols]

3
इस उत्तर के लिए धन्यवाद। मैंने वह भी पाया dt[, !..keep_cols]और dt[, -..keep_cols] उम्मीद के मुताबिक काम करता है!
आइसक्रीम

3

@, इस समाधान को इंगित करने के लिए आपका बहुत-बहुत धन्यवाद। यह मेरे लिए बहुत अच्छा काम करता है।

मैं मुद्रण से और ऊपर के उदाहरण से सिर्फ एक स्तंभ को बाहर करने का एक तरीका ढूंढ रहा था। दूसरे कॉलम को बाहर करने के लिए आप कुछ इस तरह से कर सकते हैं

library(data.table)
dt <- data.table(a=1:2, b=2:3, c=3:4)
dt[,.SD,.SDcols=-2]
dt[,.SD,.SDcols=c(1,3)]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.