R'deki bir data.frame öğesinden tüm sütunu kaldırma


267

Herkes R bir data.frame bir sütunun tamamını kaldırmak biliyor mu? Örneğin, bu data.frame verildi:

> 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

ve 2. sütunu kaldırmak istiyorum.


Yanıtlar:


414

Olarak ayarlayabilirsiniz 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

Yorumlarda belirtildiği gibi, işte başka olasılıklar:

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

Birden fazla sütunu şu yollarla kaldırabilirsiniz:

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

Bununla birlikte, bir vektörle sonuçlanabileceğiniz için matris alt kümelenmesine dikkat edin:

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

48
veya şunu kullanabilirsiniz: Veri <- Veri [, - 2]
Ian Fellows

2
virgülle, "FALSE" ifadesi, veri yalnızca tek bir sütundan oluştuğunda data.frame ifadesinin bir data.frame içinde kalmasını sağlayan "drop" bağımsız değişkenini de kontrol edebilirsiniz. Virgül olmadan, birden çok sütunun sola veya sadece bir damla [-2] ekstraksiyonu için yok sayılır
mdsumner

3
@mdsumner Data[-2]gerekmez dropher zaman dönmek neden argüman data.framedan data.frame. Ve bunun yerelleştirilmiş sütunlara (ve yalnızca sütunlara) daha iyi bir yol olduğunu düşünüyorum data.frame(ve daha hızlı). : Check cars[-1](tek sütun data.framedaha iyi) ya da cars[-(1:2)]: data frame with 0 columns and 50 rows.
Marek

1
Ayrıca Veri yazabilirsiniz [2] <- NULL
Wojciech Sobala

11
Küçük ipucu: Birden çok sütunu kaldırırken Data[c(1,2)]<-list(NULL)gereklidir.
Marek

69

Bir veya daha fazla sütunu ada göre kaldırmak için, sütun adları bilindiğinde (çalışma zamanında belirlenmesinin aksine), subset()sözdizimini seviyorum . Örneğin veri çerçevesi için

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

sadece ayapabileceğiniz sütunu kaldırmak için

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

ve yapabileceğiniz bve dsütunlarını kaldırmak için

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

İle arasındaki dve arasındaki tüm sütunları kaldırabilirsiniz b:

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

Yukarıda söylediğim gibi, bu sözdizimi yalnızca sütun adları bilindiğinde çalışır. Sütun adları programlı olarak belirlendiğinde (yani bir değişkene atandığında) çalışmaz. Bu uyarıyı?subset belgelerden çoğaltacağım:

Uyarı:

Bu, etkileşimli olarak kullanılması amaçlanan bir kullanışlılık işlevidir. Programlama için '[' gibi standart altküme işlevlerini kullanmak daha iyidir ve özellikle 'altküm' argümanının standart dışı değerlendirmesinin beklenmedik sonuçları olabilir.


26

(Tamlık için) Sütunları ada göre kaldırmak istiyorsanız, bunu yapabilirsiniz:

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]

Dahil drop = Fetmek, data.frameyalnızca bir sütun kalsa bile sonucun yine de olmasını sağlar .


22

Gönderilen cevaplar data.frames ile çalışırken çok iyidir . Ancak, bu görevler bir bellek açısından oldukça verimsiz olabilir. Büyük verilerle, bir sütunu kaldırmak olağandışı uzun bir zaman alabilir ve / veya out of memoryhatalar nedeniyle başarısız olabilir . Paket data.table, :=operatörle bu sorunun giderilmesine yardımcı olur :

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

Farklılıkları göstermek için daha büyük bir örnek oluşturmalıyım. Bu yanıtı bir noktada güncelleyeceğim.


3
Bu data.table::setişlev, data.framekopya oluşturmadan bir sütunu anında kaldırmak veya değiştirmek için kullanılabilir . Buraya
GSee

8

İle bir veya daha fazla sütunu dplyr::select()ve bazı yardımcı işlevleri kaldırmak için birkaç seçenek vardır . Bazı işlevler tüm özel sütunların atanmasını gerektirmediğinden yardımcı işlevler yararlı olabilir. Sütunları kullanarak bırakmak için sütun adlarını reddetmek üzere select()bir satır aralığı kullanmanız gerektiğini unutmayın -.

dplyr::starwarsSütun adlarında çeşitlilik için örnek verileri kullanma :

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 

Ayrıca sütun numarasına göre de bırakabilirsiniz:

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

Mükemmel cevap. Herhangi bir satırında belirli bir değer içeren bir sütunun nasıl bırakılacağı hakkında herhangi bir fikir (yukarıda önerdiğiniz gibi sütun adında değil)?
Laura K

df [, - hangi (sapply (df, fonksiyon (x) herhangi biri (x == a)))]], burada df veri çerçeveniz ve a sizin özel değerinizdir, örneğin: mtcars [, - hangi (sapply (mtcars, işlevi (x) herhangi biri (x == 4)))]
Nanami

7

Bununla birlikte columnve variablebaşka bir depoya saklayabilirsiniz variable.

df = subset(data, select = -c(genome) )
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.