Rimuovi un'intera colonna da un data.frame in R


267

Qualcuno sa come rimuovere un'intera colonna da un data.frame in R? Ad esempio se mi viene dato questo 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

e voglio rimuovere la seconda colonna.


1
Possibile duplicato di colonne di
rilascio

Risposte:


414

Puoi impostarlo su 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

Come sottolineato nei commenti, ecco alcune altre possibilità:

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

Puoi rimuovere più colonne tramite:

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

Fai attenzione al sottoinsieme di matrici, poiché puoi finire con un vettore:

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

48
oppure puoi utilizzare: Dati <- Dati [, - 2]
Ian Fellows

2
con la virgola puoi anche controllare l'argomento "drop", che quando FALSO significa che data.frame rimane un data.frame quando il risultato è costituito da una sola colonna - senza la virgola otterrai sempre un data.frame se più colonne sono a sinistra o solo uno - drop viene ignorato per l'estrazione [-2]
mdsumner

3
@mdsumner Data[-2]non ha bisogno di dropargomenti perché ritorna sempre data.frameda data.frame. E penso che questo sia un modo molto migliore per le colonne localizzate (e solo le colonne) in data.frame(ed è più veloce). Controllare: cars[-1](uno col data.frame) o meglio cars[-(1:2)]: data frame with 0 columns and 50 rows.
Marek,

1
Puoi anche scrivere Data [2] <- NULL
Wojciech Sobala il

11
Suggerimento minore: quando Data[c(1,2)]<-list(NULL)è necessaria la rimozione di più colonne .
Marek,

69

Per rimuovere una o più colonne per nome, quando i nomi delle colonne sono noti (anziché essere determinati in fase di esecuzione), mi piace la subset()sintassi. Ad esempio per il frame di dati

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

per rimuovere solo la acolonna che potresti fare

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

e per rimuovere le colonne be dche potresti fare

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

Puoi rimuovere tutte le colonne tra de bcon:

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

Come ho detto sopra, questa sintassi funziona solo quando sono noti i nomi delle colonne. Non funzionerà quando si dice che i nomi delle colonne sono determinati a livello di programmazione (ovvero assegnati a una variabile). Riprodurrò questo avviso dalla ?subsetdocumentazione:

Avvertimento:

Questa è una funzione di praticità destinata all'uso interattivo. Per la programmazione è meglio usare le funzioni di subsetting standard come '[', e in particolare la valutazione non standard dell'argomento 'subset' può avere conseguenze impreviste.


26

(Per completezza) Se vuoi rimuovere le colonne per nome, puoi farlo:

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]

Includendo si drop = Fassicura che il risultato sarà ancora un data.frameanche se rimane solo una colonna.


22

Le risposte pubblicate sono molto buone quando si lavora con data.frames. Tuttavia, queste attività possono essere piuttosto inefficienti dal punto di vista della memoria. Con dati di grandi dimensioni, la rimozione di una colonna può richiedere un tempo insolitamente lungo e / o non riuscire a causa di out of memoryerrori. Il pacchetto data.tableaiuta a risolvere questo problema con l' :=operatore:

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

Dovrei mettere insieme un esempio più grande per mostrare le differenze. A un certo punto aggiornerò questa risposta.


3
La data.table::setfunzione può essere usata su data.frames per rimuovere o modificare istantaneamente una colonna, senza fare copie. Vedi qui
GSee

8

Esistono diverse opzioni per rimuovere una o più colonne con dplyr::select()e alcune funzioni di supporto. Le funzioni di aiuto possono essere utili perché alcune non richiedono di assegnare un nome a tutte le colonne specifiche da eliminare. Si noti che per eliminare le colonne utilizzando select()è necessario utilizzare un lead -per negare i nomi delle colonne.

Utilizzando i dplyr::starwarsdati di esempio per una certa varietà nei nomi delle colonne:

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 

Puoi anche rilasciare per numero di colonna:

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

Bella risposta. Qualche idea su come eliminare una colonna che contiene un determinato valore in una delle sue righe (non nel nome della colonna come proposto sopra)?
Laura K,

df [, - which (sapply (df, function (x) any (x == a)))], dove df è il frame di dati e a è il tuo valore specifico, ad esempio: mtcars [, - che (sapply (mtcars, function (x) any (x == 4)))]
Nanami

7

Con questo è possibile rimuovere columne archiviare variablein un altro variable.

df = subset(data, select = -c(genome) )
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.