Mam ramkę danych i listę kolumn w tej ramce danych, które chciałbym usunąć. Użyjmy iris
zbioru danych jako przykładu. Chciałbym spadać Sepal.Length
i Sepal.Width
i używać tylko pozostałe kolumny. Jak to zrobić za pomocą select
lub select_
z dplyr
pakietu?
Oto, czego próbowałem do tej pory:
drop.cols <- c('Sepal.Length', 'Sepal.Width')
iris %>% select(-drop.cols)
Błąd w -drop.cols: nieprawidłowy argument jednoargumentowego operatora
iris %>% select_(.dots = -drop.cols)
Błąd w -drop.cols: nieprawidłowy argument jednoargumentowego operatora
iris %>% select(!drop.cols)
Błąd w! Drop.cols: nieprawidłowy typ argumentu
iris %>% select_(.dots = !drop.cols)
Błąd w! Drop.cols: nieprawidłowy typ argumentu
Czuję, że brakuje mi czegoś oczywistego, ponieważ wydaje mi się, że jest to całkiem użyteczna operacja, która powinna już istnieć. Na Githubie ktoś opublikował podobny problem , a Hadley powiedział, że używa „indeksowania negatywnego”. To jest to, co (myślę) próbowałem, ale bezskutecznie. Jakieś sugestie?
iris
, ale nie w mojej rzeczywistej ramce danych (iris
był to przykład zabawki). Moja ramka danych zawiera 4558 wierszy i 147 kolumn. Otrzymałem komunikat o błędzieError in eval(x$expr, data, x$env) : variable names are limited to 10000 bytes
. Masz jakiś pomysł, dlaczego tak się dzieje?select_vars
zamiastselect
. Teraz działa idealnie!one_of
? Chyba że brakuje mi czegoś, czego nie ma w dokumentacji pakietu (help(package='dplyr')
).help(one_of, package = "dplyr")
. Przynajmniej jest w wersji pakietu 0.5.0. Ale pomocne jest czytanie blogów, które Hadley publikuje, gdy są aktualizacje jednego z jego pakietów. Niektóre funkcje są udokumentowane w innych funkcjach. Niestety wymaga to przeczytania całej dokumentacji, co najczęściej robię, gdy chcę czegoś, co nie jest od razu oczywiste lub możliwe w przypadku funkcji.też spróbuj
## Notice the lack of quotes iris %>% select (-c(Sepal.Length, Sepal.Width))
źródło
Poza tym
select(-one_of(drop.cols))
istnieje kilka innych opcji usuwania kolumn przy użyciuselect()
, które nie obejmują definiowania wszystkich konkretnych nazw kolumn (przy użyciu przykładowych danych dplyr starwars dla większej różnorodności nazw kolumn):starwars %>% select(-(name:mass)) %>% # the range of columns from 'name' to 'mass' 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('^f.+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
źródło
select_if(~!is.list(.))
równoważneselect_if(is.list(.))
?~
jest skrótem mruczenia określającym anonimową funkcję, a nie kolejnym symbolem nie. Na przykład te dwa oznaczają to samofunction(x) {!is.list(x)}
i~!is.list(.)
. myśleć~
jako skrót dlafunction(.)
.Uważaj na tę
select()
funkcję, ponieważ jest używana zarówno w pakietach dplyr, jak i MASS, więc jeśli MASS jest załadowany, select () może nie działać poprawnie. Aby dowiedzieć się, jakie pakiety są ładowane, wpisz jesessionInfo()
i poszukaj w sekcji „inne dołączone pakiety:”. Jeśli jest załadowany, wpiszdetach( "package:MASS", unload = TRUE )
i twojaselect()
funkcja powinna znowu działać.źródło
dplyr::select()
.dselect <- dplyr::select()
.Możemy spróbować
źródło
dplyr
możliwości uczynienia podstawowych zadań analitycznych łatwymi do czytania i pisania, jestem rozczarowany, że rzeczywiste rozwiązanie wygląda jak obejście.one_of
w innym rozwiązaniu jest droga do zrobienia. Zapomniałem o tym.Innym sposobem jest zmutowanie niepożądanych kolumn na
NULL
, co pozwala uniknąć osadzonych nawiasów:head(iris,2) %>% mutate_at(drop.cols, ~NULL) # Petal.Length Petal.Width Species # 1 1.4 0.2 setosa # 2 1.4 0.2 setosa
źródło
Jeśli masz specjalny znak w nazwach kolumn, albo
select
czyselect_
może nie działać zgodnie z oczekiwaniami. Ta właściwośćdplyr
użycia"."
. Aby odnieść się do zestawu danych w pytaniu, do rozwiązania tego problemu można użyć następującego wiersza:drop.cols <- c('Sepal.Length', 'Sepal.Width') iris %>% .[,setdiff(names(.),drop.cols)]
źródło
Możesz spróbować
źródło