Verwijder een hele kolom uit een data.frame in R

Weet iemand hoe je een hele kolom uit een data.frame in R kunt verwijderen? Als ik bijvoorbeeld dit data.frame krijg:

> 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

en ik wil de 2e kolom verwijderen.


Antwoord 1, autoriteit 100%

Je kunt het instellen op 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

Zoals aangegeven in de opmerkingen, zijn hier enkele andere mogelijkheden:

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

U kunt meerdere kolommen verwijderen via:

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

Wees echter voorzichtig met matrix-subsetting, want je kunt eindigen met een vector:

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

Antwoord 2, autoriteit 17%

Om een ​​of meer kolommen op naam te verwijderen, als de kolomnamen bekend zijn (in plaats van te worden bepaald tijdens runtime), gebruik ik de subset()-syntaxis. bijv. voor het dataframe

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

om alleen de kolom a te verwijderen

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

en om de kolommen b en d te verwijderen die u zou kunnen doen

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

Je kunt alle kolommen tussen d en b verwijderen met:

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

Zoals ik hierboven al zei, werkt deze syntaxis alleen als de kolomnamen bekend zijn. Het werkt niet als de kolomnamen programmatisch worden bepaald (d.w.z. toegewezen aan een variabele). Ik reproduceer deze waarschuwing uit de ?subset documentatie:

Waarschuwing:

Dit is een gemaksfunctie die bedoeld is voor interactief gebruik.
Voor het programmeren is het beter om de standaard subsetting te gebruiken
functies zoals ‘[‘, en in het bijzonder de niet-standaard evaluatie
van argument ‘subset’ kan onverwachte gevolgen hebben.


Antwoord 3, autoriteit 7%

(Voor de volledigheid) Als u kolommen op naam wilt verwijderen, kunt u dit doen:

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]

Het opnemen van drop = F zorgt ervoor dat het resultaat nog steeds een data.frame is, zelfs als er maar één kolom overblijft.


Antwoord 4, autoriteit 5%

De geposte antwoorden zijn erg goed bij het werken met data.frames. Deze taken kunnen echter behoorlijk inefficiënt zijn vanuit geheugenperspectief. Bij veel gegevens kan het verwijderen van een kolom ongewoon lang duren en/of mislukken vanwege out of memory fouten. Pakket data.table helpt dit probleem aan te pakken met de operator :=:

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

Ik zou een groter voorbeeld moeten samenstellen om de verschillen te laten zien. Ik zal dit antwoord op een gegeven moment daarmee bijwerken.


Antwoord 5, autoriteit 2%

Er zijn verschillende opties voor het verwijderen van een of meer kolommen met dplyr::select() en enkele hulpfuncties. De helperfuncties kunnen handig zijn omdat voor sommige niet alle specifieke kolommen die moeten worden verwijderd een naam hoeven te geven. Merk op dat om kolommen te verwijderen met behulp van select() u een leidende - moet gebruiken om de kolomnamen te negeren.

De dplyr::starwars voorbeeldgegevens gebruiken voor enige variatie in kolomnamen:

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 

Je kunt ook op kolomnummer neerzetten:

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

Antwoord 6, autoriteit 2%

Hiermee kun je de column verwijderen en variable opslaan in een andere variable.

df = subset(data, select = -c(genome) )

LEAVE A REPLY

Please enter your comment!
Please enter your name here

twenty + sixteen =

Other episodes