Usuń całą kolumnę z data.frame w R


267

Czy ktoś wie, jak usunąć całą kolumnę z data.frame w R? Na przykład, jeśli otrzymam te dane. Ramka:

> 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

i chcę usunąć drugą kolumnę.


Odpowiedzi:


414

Możesz to ustawić 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

Jak wskazano w komentarzach, oto kilka innych możliwości:

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

Możesz usunąć wiele kolumn za pomocą:

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

Uważaj jednak na podzestawy macierzy, ponieważ możesz skończyć z wektorem:

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

48
lub możesz użyć: Dane <- Dane [, - 2]
Ian Fellows

2
przecinkiem możesz również kontrolować argument „upuść”, co gdy FAŁSZ oznacza, że ​​data.frame pozostaje data.frame, gdy wynik składa się tylko z jednej kolumny - bez przecinka zawsze otrzymasz dane.frame, czy wiele kolumn jest w lewo lub tylko jeden - kropla jest ignorowana w przypadku ekstrakcji [-2]
mdsumner,

3
@mdsumner Data[-2]nie potrzebują dropargumentów, bo to zawsze powrócić data.framez data.frame. I myślę, że jest to znacznie lepszy sposób na zlokalizowanie kolumn (i tylko kolumn) w data.frame(i to szybciej). Sprawdzić: cars[-1](jedna kolumna data.frame) lub lepiej cars[-(1:2)]: data frame with 0 columns and 50 rows.
Marek

1
Możesz także napisać Dane [2] <- NULL
Wojciech Sobala

11
Drobna wskazówka: przy usuwaniu wielu kolumn Data[c(1,2)]<-list(NULL)jest potrzebna.
Marek

69

Aby usunąć jedną lub więcej kolumn według nazwy, gdy nazwy kolumn są znane (w przeciwieństwie do określania w czasie wykonywania), podoba mi się subset()składnia. Np. Dla ramki danych

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

aby usunąć tylko akolumnę, którą możesz zrobić

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

i aby usunąć kolumny bi, dktóre możesz zrobić

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

Możesz usunąć wszystkie kolumny pomiędzy di za bpomocą:

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

Jak powiedziałem powyżej, ta składnia działa tylko wtedy, gdy znane są nazwy kolumn. Nie zadziała, gdy powiedzmy, że nazwy kolumn są ustalane programowo (tj. Przypisywane do zmiennej). Powielę to Ostrzeżenie z ?subsetdokumentacji:

Ostrzeżenie:

Jest to wygodna funkcja przeznaczona do użytku interaktywnego. Do programowania lepiej jest używać standardowych funkcji podzestawu, takich jak „[”, aw szczególności niestandardowa ocena argumentu „podzbiór” może mieć nieoczekiwane konsekwencje.


26

(Dla kompletności) Jeśli chcesz usunąć kolumny według nazwy, możesz to zrobić:

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]

Dołączenie drop = Fgwarantuje, że wynik będzie nadal data.frameparzysty, nawet jeśli pozostanie tylko jedna kolumna.


22

Opublikowane odpowiedzi są bardzo dobre podczas pracy z data.frames. Jednak zadania te mogą być dość nieefektywne z punktu widzenia pamięci. W przypadku dużych danych usunięcie kolumny może zająć niezwykle dużo czasu i / lub zakończyć się niepowodzeniem z powodu out of memorybłędów. Pakiet data.tablepomaga rozwiązać ten problem z :=operatorem:

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

Powinienem zebrać większy przykład, aby pokazać różnice. W pewnym momencie zaktualizuję tę odpowiedź.


3
Tej data.table::setfunkcji można użyć w data.framecelu natychmiastowego usunięcia lub modyfikacji kolumny, bez wykonywania kopii. Zobacz tutaj
GSee,

8

Istnieje kilka opcji usuwania jednej lub więcej kolumn za pomocą dplyr::select()niektórych funkcji pomocniczych. Funkcje pomocnicze mogą być przydatne, ponieważ niektóre nie wymagają nazywania wszystkich konkretnych kolumn, które mają zostać usunięte. Pamiętaj, że aby upuścić kolumny za pomocą select(), musisz użyć -znaku wiodącego, aby zanegować nazwy kolumn.

Używanie dplyr::starwarsprzykładowych danych dla niektórych odmian nazw kolumn:

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 

Możesz także upuścić według numeru kolumny:

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

Świetna odpowiedź. Masz pomysł, jak upuścić kolumnę zawierającą określoną wartość w dowolnym wierszu (nie w nazwie kolumny, jak zaproponowano powyżej)?
Laura K,

df [, - które (sapply (df, funkcja (x) dowolna (x == a)))], gdzie df to twoja ramka danych a a to twoja konkretna wartość, np .: mtcars [, - which (sapply (mtcars, funkcja (x) dowolna (x == 4))]]
Nanami

7

Dzięki temu możesz usunąć columni zapisać variablew innym variable.

df = subset(data, select = -c(genome) )
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.