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.frame
s. 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) )