आप data.table में एक कॉलम को नाम से कैसे हटाते हैं?


195

"फू" नामक कॉलम से छुटकारा पाने के लिए data.frame, मैं यह कर सकता हूं:

df <- df[-grep('foo', colnames(df))]

हालाँकि, एक बार dfकिसी data.tableऑब्जेक्ट में परिवर्तित हो जाने के बाद , किसी कॉलम को निकालने का कोई तरीका नहीं है।

उदाहरण:

df <- data.frame(id = 1:100, foo = rnorm(100))
df2 <- df[-grep('foo', colnames(df))] # works
df3 <- data.table(df)
df3[-grep('foo', colnames(df3))] 

लेकिन एक बार जब यह एक data.tableवस्तु में बदल जाता है , तो यह काम नहीं करता है।


2
इसके dtबजाय data.table नाम देना स्पष्ट होगा df3...
PatrickT

जवाबों:


283

निम्न में से किसी भी स्तंभ को हटा देगा foodata.table से df3:

# Method 1 (and preferred as it takes 0.00s even on a 20GB data.table)
df3[,foo:=NULL]

df3[, c("foo","bar"):=NULL]  # remove two columns

myVar = "foo"
df3[, (myVar):=NULL]   # lookup myVar contents

# Method 2a -- A safe idiom for excluding (possibly multiple)
# columns matching a regex
df3[, grep("^foo$", colnames(df3)):=NULL]

# Method 2b -- An alternative to 2a, also "safe" in the sense described below
df3[, which(grepl("^foo$", colnames(df3))):=NULL]

data.table निम्नलिखित सिंटैक्स का भी समर्थन करता है:

## Method 3 (could then assign to df3, 
df3[, !"foo"]  

हालांकि अगर आप वास्तव में इस स्तंभ को निकालने के लिए इच्छुक थे "foo"से df3(के रूप में बस के एक दृश्य के मुद्रण के लिए विरोध df3शून्य से स्तंभ "foo") क्या तुम सच में विधि 1 के बजाय का उपयोग करना चाहें।

(ध्यान दें कि यदि आप किसी विधि का उपयोग करते हैं, जिस पर निर्भर हैं grep()या grepl(), आपको pattern="^foo$"इसके बजाय सेट करने की आवश्यकता है "foo", यदि आप स्तंभों को नाम "fool"और "buffoon"(जैसे कि विकल्प के fooरूप में रखने वाले ) नहीं चाहते हैं, तो भी मिलान और हटाया जा सकता है।)

कम सुरक्षित विकल्प, इंटरैक्टिव उपयोग के लिए ठीक है:

अगले दो मुहावरे भी काम करेंगे - यदि df3इसमें एक कॉलम मिलान होता है"foo" - लेकिन संभवत: अप्रत्याशित तरीके से विफल होगा यदि ऐसा नहीं होता है। यदि, उदाहरण के लिए, आप उनमें से किसी का उपयोग गैर-मौजूद कॉलम को खोजने के लिए करते हैं "bar", तो आप एक शून्य-पंक्ति डेटा के साथ समाप्त हो जाएंगे।

एक परिणाम के रूप में, वे वास्तव में इंटरएक्टिव उपयोग के लिए सबसे उपयुक्त हैं जहां कोई भी हो सकता है, उदाहरण के लिए, किसी डेटा स्तंभ को किसी भी स्तंभ को प्रदर्शित करना चाहते हैं जिसमें सबस्ट्रिंग वाले नाम हों "foo"। प्रोग्रामिंग उद्देश्यों के लिए (या यदि आप वास्तव df3में इसकी एक प्रति के बजाय कॉलम (एस) को हटाना चाहते हैं ), तरीके 1, 2 ए और 2 बी वास्तव में सबसे अच्छे विकल्प हैं।

# Method 4:
df3[, .SD, .SDcols = !patterns("^foo$")]

अंतिम रूप से दृष्टिकोण का उपयोग कर रहे हैं with=FALSE, हालांकि data.tableधीरे-धीरे इस तर्क का उपयोग करने से दूर जा रहा है, इसलिए यह अब हतोत्साहित है जहां आप इससे बच सकते हैं; यदि आपको वास्तव में इसकी आवश्यकता है तो विकल्प दिखाने के लिए यहां आपको विकल्प मौजूद है:

# Method 5a (like Method 3)
df3[, !"foo", with=FALSE] 
# Method 5b (like Method 4)
df3[, !grep("^foo$", names(df3)), with=FALSE]
# Method 5b (another like Method 4)
df3[, !grepl("^foo$", names(df3)), with=FALSE]

2
-grepबनाम के बारे में ओपी को मेरी टिप्पणी देखें !grepl
जोशुआ उलरिच

1
@ जोशुआलरिच - अच्छा बिंदु। मैं grepl()initally कोशिश की और यह काम नहीं किया, क्योंकि data.table कॉलम एक तार्किक वेक्टर द्वारा अनुक्रमित नहीं किया जा सकता है। लेकिन मुझे अब एहसास हुआ कि grepl()इसे लपेटकर काम किया जा सकता है which(), ताकि यह एक पूर्णांक वेक्टर लौटाए।
जोश ओ'ब्रायन

1
मुझे नहीं पता था कि इसके साथ अनुक्रमण के बारे में data.table, लेकिन इसे लपेटना whichचतुर है!
जोशुआ उलरिच

6
मुझे नहीं पता था कि data.tableया तो के बारे में ; जोड़ा एफआर # 1797 । लेकिन, विधि 1 दूसरों की तुलना में असीम रूप से तेज है। विधि 1 किसी भी प्रतिलिपि के साथ संदर्भ द्वारा स्तंभ को निकालता है। मुझे लगता है कि आप इसे किसी भी आकार data.table के लिए 0.005 सेकंड से ऊपर पा सकते हैं। इसके विपरीत, यदि तालिका 50% RAM के पास है तो अन्य बिल्कुल भी काम नहीं कर सकते हैं क्योंकि वे सभी कॉपी करते हैं लेकिन हटाने के लिए।
मैट डॉवले

1
@ user3969377 यदि आप एक वर्ण चर की सामग्री के आधार पर एक कॉलम को निकालना चाहते हैं तो आप इसे केवल कोष्ठक में लपेटेंगे। अर्थात। df [, (afoo): = NULL]
डीन मैकग्रेगर

31

आप इसके लिए भी उपयोग कर सकते हैं set, जो [.data.tableछोरों के ओवरहेड से बचा जाता है :

dt <- data.table( a=letters, b=LETTERS, c=seq(26), d=letters, e=letters )
set( dt, j=c(1L,3L,5L), value=NULL )
> dt[1:5]
   b d
1: A a
2: B b
3: C c
4: D d
5: E e

यदि आप इसे स्तंभ नाम से करना चाहते हैं, तो इसके which(colnames(dt) %in% c("a","c","e"))लिए काम करना चाहिए j


2
data.table१.११ . column में, यदि आप इसे कॉलम नाम से करना चाहते हैं, तो आप सीधे कर सकते हैं rm.col = c("a","b")औरdt[, (rm.col):=NULL]
ड्यूकियो ए

20

मैं बस इसे डेटा फ्रेम तरह से करता हूं:

DT$col = NULL

तेजी से काम करता है और जहाँ तक मैं देख सकता हूँ कोई समस्या नहीं है।

अद्यतन: यदि आपका डीटी बहुत बड़ा नहीं है, तो सबसे अच्छा तरीका है, क्योंकि $<-ऑपरेटर का उपयोग करने से ऑब्जेक्ट कॉपी हो जाएगा। तो बेहतर उपयोग:

DT[, col:=NULL]

8

डेटा तालिका में हटाने के लिए आपके पास बहुत से व्यक्तिगत कॉलम हैं और आप सभी कॉलम नामों में टाइप करने से बचना चाहते हैं #careadviced

dt <- dt[, -c(1,4,6,17,83,104)]

इसके बजाय कॉलम नंबर के आधार पर कॉलम हटाए जाएंगे।

यह स्पष्ट रूप से उतना कुशल नहीं है क्योंकि यह डेटा को प्रदर्शित करता है। लेकिन अगर आप 500,000 पंक्तियों से कम काम कर रहे हैं तो यह ठीक काम करता है



-2

यहाँ एक तरीका है जब आप NULL को अपने कॉलम का एक सेट देना चाहते हैं, उनके कॉलम को आपके उपयोग के लिए एक फ़ंक्शन दिया गया है :)

deleteColsFromDataTable <- function (train, toDeleteColNames) {

       for (myNm in toDeleteColNames)

       train <- train [,(myNm):=NULL]

       return (train)
}


-7

Data.table के लिए, NULL को कॉलम असाइन करना इसे हटा देता है:

DT[,c("col1", "col1", "col2", "col2")] <- NULL
^
|---- Notice the extra comma if DT is a data.table

... जो इसके बराबर है:

DT$col1 <- NULL
DT$col2 <- NULL
DT$col3 <- NULL
DT$col4 <- NULL

Data.frame के लिए बराबर है:

DF[c("col1", "col1", "col2", "col2")] <- NULL
      ^
      |---- Notice the missing comma if DF is a data.frame

Q. data.table के लिए संस्करण में अल्पविराम क्यों है, और data.frame के संस्करण में कोई अल्पविराम नहीं है?

A. जैसा कि डेटा.फ्रेम को कॉलम की एक सूची के रूप में संग्रहीत किया जाता है, आप कॉमा को छोड़ सकते हैं। आप इसे इसमें जोड़ भी सकते हैं, हालाँकि तब आपको उन्हें NULLs की सूची में निर्दिष्ट करना होगा DF[, c("col1", "col2", "col3")] <- list(NULL)


@ अगर मैं किसी भी स्थिति के बारे में नहीं सोच सकता, data.framesजहां पंक्ति और स्तंभ स्विच किए जाएंगे। यह अतार्किक होगा।
दुहरास

@ अरुन मैंने आपको टैग किया क्योंकि आपकी पहली टिप्पणी से ऐसा लगता है कि ऐसे समय थे जिन पर आप कॉल कर सकते हैं DF[column,row]इसलिए मैं सिर्फ यह देखना चाहता था कि क्या वास्तव में कोई भी उदाहरण हैं जहां ऐसा हुआ था।
डुहास

टाइपो को हटाने का उत्तर अपडेट करें।
कंटैंगो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.