Remova uma coluna inteira de um data.frame em R


267

Alguém sabe como remover uma coluna inteira de um data.frame no R? Por exemplo, se eu receber esse 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 eu quero remover a segunda coluna.


Respostas:


414

Você pode configurá-lo para 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

Como apontado nos comentários, aqui estão algumas outras possibilidades:

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

Você pode remover várias colunas através de:

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

Tenha cuidado com o subconjunto da matriz, pois você pode acabar com um vetor:

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

48
ou você pode usar: Dados <- Dados [, - 2] #
Ian Fellows

2
com a vírgula, você também pode controlar o argumento "drop", que quando FALSE significa que data.frame permanece um data.frame quando o resultado consiste em apenas uma coluna - sem a vírgula, você sempre obterá um data.frame, se várias colunas forem esquerda ou apenas um - queda é ignorado para o [-2] extração
mdsumner

3
@mdsumner Data[-2]não precisa de dropargumento porque ele sempre retornam data.framea partir data.frame. E eu acho que essa é uma maneira muito melhor de colunas localizadas (e apenas colunas) no data.frame(e é mais rápido). Confira: cars[-1](um col data.frame) ou melhor cars[-(1:2)]: data frame with 0 columns and 50 rows.
Marek

1
Você também pode escrever Data [2] <- NULL
Wojciech Sobala

11
Dica secundária: ao remover várias colunas, Data[c(1,2)]<-list(NULL)é necessário.
Marek

69

Para remover uma ou mais colunas pelo nome, quando os nomes das colunas são conhecidos (em vez de serem determinados no tempo de execução), eu gosto da subset()sintaxe. Por exemplo, para o quadro de dados

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

para remover apenas a acoluna que você poderia fazer

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

e para remover as colunas be dvocê poderia fazer

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

Você pode remover todas as colunas entre de bcom:

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

Como eu disse acima, essa sintaxe funciona apenas quando os nomes das colunas são conhecidos. Não funcionará quando, digamos, os nomes das colunas forem determinados programaticamente (isto é, atribuídos a uma variável). Vou reproduzir este aviso da ?subsetdocumentação:

Aviso:

Esta é uma função de conveniência destinada ao uso interativamente. Para a programação, é melhor usar as funções de subconjunto padrão como '[' e, em particular, a avaliação não padrão do argumento 'subconjunto' pode ter consequências imprevistas.


26

(Para completar) Se você deseja remover as colunas pelo nome, pode fazer o seguinte:

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]

A inclusão drop = Fgarante que o resultado ainda será um, data.framemesmo que apenas uma coluna permaneça.


22

As respostas postadas são muito boas quando se trabalha com data.frames. No entanto, essas tarefas podem ser bastante ineficientes do ponto de vista da memória. Com dados grandes, a remoção de uma coluna pode levar um tempo invulgarmente longo e / ou falhar devido a out of memoryerros. O pacote data.tableajuda a solucionar esse problema com o :=operador:

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

Eu deveria montar um exemplo maior para mostrar as diferenças. Vou atualizar esta resposta em algum momento com isso.


3
A data.table::setfunção pode ser usada em data.frames para remover ou modificar uma coluna instantaneamente, sem fazer cópias. Veja aqui
GSee

8

Existem várias opções para remover uma ou mais colunas com dplyr::select()e algumas funções auxiliares. As funções auxiliares podem ser úteis porque algumas não exigem que todas as colunas específicas sejam nomeadas para serem eliminadas. Observe que, para eliminar colunas usando, select()você precisa usar uma guia -para negar os nomes das colunas.

Usando os dplyr::starwarsdados de amostra para alguma variedade nos nomes de colunas:

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 

Você também pode soltar pelo número da coluna:

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

Ótima resposta. Alguma idéia de como soltar uma coluna que contém um determinado valor em qualquer uma de suas linhas (não no nome da coluna, como você propôs acima)?
Laura K

df [, - que (sapply (df, função (x) qualquer (x == a)))]], onde df é seu quadro de dados e a é seu valor específico, por exemplo: mtcars [, - what (sapply (mtcars, função (x) qualquer (x == 4))]]
Nanami

7

Com isso, você pode remover columne armazenar variableem outro variable.

df = subset(data, select = -c(genome) )
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.