R में एक data.frame से संपूर्ण स्तंभ निकालें


267

क्या किसी को पता है कि R में एक data.frame से पूरे कॉलम को कैसे हटाया जाए? उदाहरण के लिए अगर मुझे यह डेटा दिया जाता है।

> head(data)
   chr       genome region
1 chr1 hg19_refGene    CDS
2 chr1 hg19_refGene   exon
3 chr1 hg19_refGene    CDS
4 chr1 hg19_refGene   exon
5 chr1 hg19_refGene    CDS
6 chr1 hg19_refGene   exon

और मैं दूसरा कॉलम हटाना चाहता हूं।


जवाबों:


414

आप इसे सेट कर सकते हैं NULL

> Data$genome <- NULL
> head(Data)
   chr region
1 chr1    CDS
2 chr1   exon
3 chr1    CDS
4 chr1   exon
5 chr1    CDS
6 chr1   exon

जैसा कि टिप्पणियों में बताया गया है, यहां कुछ अन्य संभावनाएं हैं:

Data[2] <- NULL    # Wojciech Sobala
Data[[2]] <- NULL  # same as above
Data <- Data[,-2]  # Ian Fellows
Data <- Data[-2]   # same as above

आप के माध्यम से कई कॉलम निकाल सकते हैं:

Data[1:2] <- list(NULL)  # Marek
Data[1:2] <- NULL        # does not work!

मैट्रिक्स-सबसेट के साथ सावधान रहें, क्योंकि आप एक वेक्टर के साथ समाप्त हो सकते हैं:

Data <- Data[,-(2:3)]             # vector
Data <- Data[,-(2:3),drop=FALSE]  # still a data.frame

48
या आप उपयोग कर सकते हैं: डेटा <- डेटा [, - 2]
इयान फेलो

2
अल्पविराम के साथ आप "ड्रॉप" तर्क को भी नियंत्रित कर सकते हैं, जो कि जब FALSE का अर्थ है data.frame रहता है एक data.frame जब परिणाम केवल एक स्तंभ के होते हैं - अल्पविराम के बिना आपको हमेशा एक डेटा मिलेगा। एकाधिक कॉलम हैं छोड़ दिया या सिर्फ एक - ड्रॉप [-2] निष्कर्षण के लिए नजरअंदाज कर दिया गया है
mdsumner

3
@ मंदसुने Data[-2]को dropतर्क की आवश्यकता नहीं है क्योंकि यह हमेशा से लौटता data.frameहै data.frame। और मुझे लगता है कि यह स्थानीयकृत कॉलम (और केवल कॉलम) में data.frame(और यह तेज है) के लिए बहुत बेहतर तरीका है । जाँच करें: cars[-1](एक स्तंभ data.frame) या बेहतर cars[-(1:2)]: data frame with 0 columns and 50 rows
मारेक

1
आप डेटा [2] <- NULL
Wojciech Sobala

11
माइनर टिप: कई कॉलम को हटाते समय Data[c(1,2)]<-list(NULL)जरूरत होती है।
मारेक

69

नाम से एक या एक से अधिक कॉलम निकालने के लिए, जब कॉलम के नाम ज्ञात होते हैं (जैसा कि रन-टाइम पर निर्धारित होने के विपरीत), मुझे subset()सिंटैक्स पसंद है । जैसे डेटा-फ्रेम के लिए

df <- data.frame(a=1:3, d=2:4, c=3:5, b=4:6)

aआपके द्वारा किए जा सकने वाले कॉलम को निकालने के लिए

Data <- subset( Data, select = -a )

और आपके द्वारा किए जा सकने वाले bऔर dस्तंभों को हटाने के लिए

Data <- subset( Data, select = -c(d, b ) )

आप बीच dऔर bसाथ के सभी कॉलम हटा सकते हैं :

Data <- subset( Data, select = -c( d : b )

जैसा कि मैंने ऊपर कहा, यह सिंटैक्स केवल तब काम करता है जब कॉलम नाम ज्ञात होते हैं। जब कॉलम नाम प्रोग्रामेटिक रूप से निर्धारित किए जाते हैं (यानी एक चर को सौंपा जाता है) तो यह काम नहीं करेगा। मैं ?subsetदस्तावेज़ से इस चेतावनी को पुन: पेश करूंगा :

चेतावनी:

यह एक सुविधा फ़ंक्शन है जो अंतःक्रियात्मक रूप से उपयोग करने के लिए है। प्रोग्रामिंग के लिए मानक उपसमुच्चय जैसे '[' का उपयोग करना बेहतर है, और विशेष रूप से तर्क के गैर-मानक मूल्यांकन 'उपसेट' में अप्रत्याशित परिणाम हो सकते हैं।


26

(पूर्णता के लिए) यदि आप नाम से कॉलम हटाना चाहते हैं, तो आप ऐसा कर सकते हैं:

cols.dont.want <- "genome"
cols.dont.want <- c("genome", "region") # if you want to remove multiple columns

data <- data[, ! names(data) %in% cols.dont.want, drop = F]

सहित drop = Fयह सुनिश्चित करता है कि परिणाम अभी भी एक data.frameही होगा यदि केवल एक कॉलम रहता है।


22

data.frameएस के साथ काम करते समय पोस्ट किए गए उत्तर बहुत अच्छे हैं । हालाँकि, ये कार्य मेमोरी परिप्रेक्ष्य से काफी अक्षम हो सकते हैं। बड़े डेटा के साथ, एक कॉलम को हटाने में out of memoryत्रुटियों की वजह से असामान्य रूप से लंबी अवधि और / या असफल हो सकती है । पैकेज ऑपरेटर के data.tableसाथ इस समस्या को हल करने में मदद करता है :=:

library(data.table)
> dt <- data.table(a = 1, b = 1, c = 1)
> dt[,a:=NULL]
     b c
[1,] 1 1

मुझे मतभेद दिखाने के लिए एक बड़ा उदाहरण पेश करना चाहिए। मैं उसके साथ कुछ बिंदु पर इस उत्तर को अपडेट करूंगा।


3
data.table::setसमारोह पर इस्तेमाल किया जा सकता data.frameहटाने या तुरन्त एक स्तंभ संशोधित करने के लिए, प्रतियां बनाने के बिना है। यहां
GSee

8

dplyr::select()कुछ सहायक कार्यों के साथ एक या एक से अधिक कॉलम हटाने के कई विकल्प हैं । सहायक कार्य उपयोगी हो सकते हैं क्योंकि कुछ को सभी विशिष्ट स्तंभों को नामांकित करने की आवश्यकता नहीं है। ध्यान दें कि कॉलम के नामों को नकारने के लिए आपको select()एक अग्रणी कॉलम का उपयोग करना होगा -

dplyr::starwarsस्तंभ नामों में कुछ विविधता के लिए नमूना डेटा का उपयोग करना :

library(dplyr)

starwars %>% 
  select(-height) %>%                  # a specific column name
  select(-one_of('mass', 'films')) %>% # any columns named in one_of()
  select(-(name:hair_color)) %>%       # the range of columns from 'name' to 'hair_color'
  select(-contains('color')) %>%       # any column name that contains 'color'
  select(-starts_with('bi')) %>%       # any column name that starts with 'bi'
  select(-ends_with('er')) %>%         # any column name that ends with 'er'
  select(-matches('^v.+s$')) %>%       # any column name matching the regex pattern
  select_if(~!is.list(.)) %>%          # not by column name but by data type
  head(2)

# A tibble: 2 x 2
homeworld species
  <chr>     <chr>  
1 Tatooine  Human  
2 Tatooine  Droid 

आप कॉलम संख्या द्वारा भी छोड़ सकते हैं:

starwars %>% 
  select(-2, -(4:10)) # column 2 and columns 4 through 10

बहुत बढ़िया जवाब। किसी स्तंभ को कैसे गिराया जाए, इस पर कोई विचार इसके किसी भी पंक्तियों में एक निश्चित मूल्य होता है (इसके स्तंभ नाम में नहीं जैसा कि आपने ऊपर प्रस्तावित किया है)?
लॉरा के

df [, - जो (sapply (df, function (x) any (x == a))]] है, जहाँ df आपका डेटा फ़्रेम है और a आपकी विशिष्ट वैल्यू है, जैसे: mtcars [, - (sapply (mtcars,) function (x) any (x == 4)))]
Nanami

7

इससे आप दूसरे में columnस्टोर कर सकते हैं और स्टोर कर सकते हैं ।variablevariable

df = subset(data, select = -c(genome) )
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.