2012-03-23 13 views
6

Często trzeba usunąć listy kolumn z data.frame.usuwanie listy kolumn z danych.frame przy użyciu podzbioru

I zazwyczaj to zrobić:

to.remove <- c("hp","drat","wt","qsec") 
mtcars[,-which(names(mtcars) %in% to.remove)] 

który działa dobrze.

Ale chciałbym móc to zrobić w czystszy sposób przy użyciu subset. Ale wydaje się, że dołącza dane.frame, a następnie uzyskuje dostęp do nazw kolumn jako zmiennych zamiast łańcuchów.

Na przykład to, co chciałbym być w stanie to zrobić:

subset(mtcars,select=-to.remove) 

Czy istnieje sposób zmusić subset do korzystania z ciągów wektorów w rachunku select? Czy jest jeszcze inna lepsza alternatywa?

Odpowiedz

22

to pewnie zrobić to tak:

to.remove <- c("hp","drat","wt","qsec") 
`%ni%` <- Negate(`%in%`) 
subset(mtcars,select = names(mtcars) %ni% to.remove) 

(używam %ni% dużo, więc mam to wbudowane w moim .Rprofile już.)

+0

Nicea użycie operatora binarnego utworzonego z neguje +1 –

+0

@TylerRinker nie pamiętam już gdzie wybrałem się z tej funkcji. Musiał to być SO lub r-help. – joran

+0

Bardzo fajnie jest się uczyć o Negate. Rzadko używam rzeczy w "funprogu" i jest to bardzo przydatne. – Jesse

4

Można oczywiście użyć select, ale Musimy przekazywać imiona, a nie znaki. Więc to będzie działać:

subset(mtcars, select = -c(hp, drat, wt, qsec)) 
Powiązane problemy