mutate each / summate each in dplyr: jak wybrać określone kolumny i nadać nowe nazwy zmutowanym kolumnom?
Jestem trochę zdezorientowany dplyr
czasownik mutate_each.
Jest całkiem proste użycie podstawowej mutate
do przekształcenia kolumny danych w, powiedzmy, z-scores i utworzenia nowej kolumny w danych.ramka (tu z nazwą z_score_data
):
newDF <- DF %>%
select(one_column) %>%
mutate(z_score_data = one_column - (mean(one_column) / sd(one_column))
Jednakże, ponieważ mam wiele kolumn danych, które chciałbym przekształcić, wydaje się, że powinienem prawdopodobnie użyć czasownika mutate_each
.
newDF <- DF %>%
mutate_each(funs(scale))
Jak na razie dobrze. Ale jak na razie nie udało mi się tego rozgryźć:
- Jak mogę dać te nowe kolumny odpowiednie nazwy, jak Mogę w
mutate
? - Jak mogę wybrać kolumny, które chcę zmutować, tak jak to zrobiłem z
select
w pierwszym przypadku?
2 answers
Aktualizacja dla dplyr >= 0.4.3.9000
W wersji rozwojowej dplyr 0.4.3.9000 (w momencie pisania) nazwy wewnątrzmutate_each
i summarise_each
zostały uproszczone, jak zauważono w News :
Zachowanie nazw
summarise_each()
imutate_each()
zostało podkręcony tak, że można wymusić włączenie zarówno funkcji, jak i nazwa zmiennej:summarise_each(mtcars, funs(mean = mean), everything())
Jest to głównie ważne, jeśli chcesz zastosować tylko 1 funkcję wewnątrz mutate_each
/ summarise_each
i chcesz dać te kolumny nowe nazwy.
Aby pokazać różnicę, oto wyjście z dplyr 0.4.3.9000 przy użyciu nowej funkcji nazewnictwa, w przeciwieństwie do opcji a. 2 poniżej:
library(dplyr) # >= 0.4.3.9000
iris %>% mutate_each(funs(mysum = sum(.)), -Species) %>% head()
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species Sepal.Length_mysum Sepal.Width_mysum
#1 5.1 3.5 1.4 0.2 setosa 876.5 458.6
#2 4.9 3.0 1.4 0.2 setosa 876.5 458.6
#3 4.7 3.2 1.3 0.2 setosa 876.5 458.6
#4 4.6 3.1 1.5 0.2 setosa 876.5 458.6
#5 5.0 3.6 1.4 0.2 setosa 876.5 458.6
#6 5.4 3.9 1.7 0.4 setosa 876.5 458.6
# Petal.Length_mysum Petal.Width_mysum
#1 563.7 179.9
#2 563.7 179.9
#3 563.7 179.9
#4 563.7 179.9
#5 563.7 179.9
#6 563.7 179.9
Jeśli nie podasz nowych nazw, a podasz tylko 1 funkcję, dplyr zmieni istniejące kolumny (tak jak miało to miejsce w poprzednich wersjach):
iris %>% mutate_each(funs(sum), -Species) %>% head()
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1 876.5 458.6 563.7 179.9 setosa
#2 876.5 458.6 563.7 179.9 setosa
#3 876.5 458.6 563.7 179.9 setosa
#4 876.5 458.6 563.7 179.9 setosa
#5 876.5 458.6 563.7 179.9 setosa
#6 876.5 458.6 563.7 179.9 setosa
Zakładam, że ta nowa funkcjonalność będzie dostępna za pośrednictwem CRAN w następnej wersji 0.4.4.
Dplyr verions
Jak mogę nadać tym nowym kolumnom odpowiednie nazwy, tak jak Mogę w
mutować?
A) 1 funkcja zastosowana w mutate_each
/ summarise_each
Jak mogę nadać tym nowym kolumnom odpowiednie nazwy, tak jak Mogę w mutować?
mutate_each
/ summarise_each
Jeśli zastosujesz tylko 1 funkcję wewnątrz mutate_each
lub summarise_each
, istniejące kolumny zostaną przekształcone, a nazwy zostaną zachowane tak, jak kiedyś, , chyba że podasz nazwany wektor do mutate_each_
/summarise_each_
(patrz opcja a.4)
Oto kilka przykładów:
A. 1 only 1 function - > will keep the existing nazwy
iris %>% mutate_each(funs(sum), -Species) %>% head()
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1 876 459 564 180 setosa
#2 876 459 564 180 setosa
#3 876 459 564 180 setosa
#4 876 459 564 180 setosa
#5 876 459 564 180 setosa
#6 876 459 564 180 setosa
A. 2 również jeśli podasz rozszerzenie nazwy nowej kolumny:
iris %>% mutate_each(funs(mysum = sum(.)), -Species) %>% head()
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1 876 459 564 180 setosa
#2 876 459 564 180 setosa
#3 876 459 564 180 setosa
#4 876 459 564 180 setosa
#5 876 459 564 180 setosa
#6 876 459 564 180 setosa
A. 3 ręcznie określ nową nazwę dla kolumny (ale praktyczna tylko dla kilku kolumn):
iris %>% mutate_each(funs(sum), SLsum = Sepal.Length,SWsum = Sepal.Width, -Species) %>% head()
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species SLsum SWsum
#1 5.1 3.5 1.4 0.2 setosa 876 459
#2 4.9 3.0 1.4 0.2 setosa 876 459
#3 4.7 3.2 1.3 0.2 setosa 876 459
#4 4.6 3.1 1.5 0.2 setosa 876 459
#5 5.0 3.6 1.4 0.2 setosa 876 459
#6 5.4 3.9 1.7 0.4 setosa 876 459
A. 4 Użyj nazwanego wektora, aby utworzyć dodatkowe kolumny o nowych nazwach:
Przypadek 1: zachowaj oryginalne kolumny
W przeciwieństwie do opcji a. 1, A.2 i a.3, dplyr zachowa istniejące kolumny bez zmian i utworzy nowe kolumny w tym podejściu. Nazwy nowych kolumn równe nazwy wektora nazwanego, który tworzysz z góry (vars
w tym przypadku).
vars <- names(iris)[1:2] # choose which columns should be mutated
vars <- setNames(vars, paste0(vars, "_sum")) # create new column names
iris %>% mutate_each_(funs(sum), vars) %>% head
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species Sepal.Length_sum Sepal.Width_sum
#1 5.1 3.5 1.4 0.2 setosa 876.5 458.6
#2 4.9 3.0 1.4 0.2 setosa 876.5 458.6
#3 4.7 3.2 1.3 0.2 setosa 876.5 458.6
#4 4.6 3.1 1.5 0.2 setosa 876.5 458.6
#5 5.0 3.6 1.4 0.2 setosa 876.5 458.6
#6 5.4 3.9 1.7 0.4 setosa 876.5 458.6
Przypadek 2: Usuń oryginalne kolumny
Jak widać, takie podejście utrzymuje istniejące kolumny bez zmian i dodaje nowe kolumny o określonych nazwach. Jeśli nie chcesz zachować oryginalnych kolumn, ale tylko nowo utworzone kolumny (i inne kolumny), możesz po prostu dodać select
instrukcję:
iris %>% mutate_each_(funs(sum), vars) %>% select(-one_of(vars)) %>% head
# Petal.Length Petal.Width Species Sepal.Length_sum Sepal.Width_sum
#1 1.4 0.2 setosa 876.5 458.6
#2 1.4 0.2 setosa 876.5 458.6
#3 1.3 0.2 setosa 876.5 458.6
#4 1.5 0.2 setosa 876.5 458.6
#5 1.4 0.2 setosa 876.5 458.6
#6 1.7 0.4 setosa 876.5 458.6
B) więcej niż 1 funkcja zastosowana w mutate_each
/summarise_each
B. 1 niech dplyr wykona nowe nazwy
Jeśli zastosowałeś więcej niż 1 funkcję, możesz pozwolić dplyr samodzielnie obliczyć nazwy (i zachowa istniejące kolumny):
iris %>% mutate_each(funs(sum, mean), -Species) %>% head()
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species Sepal.Length_sum Sepal.Width_sum Petal.Length_sum
#1 5.1 3.5 1.4 0.2 setosa 876 459 564
#2 4.9 3.0 1.4 0.2 setosa 876 459 564
#3 4.7 3.2 1.3 0.2 setosa 876 459 564
#4 4.6 3.1 1.5 0.2 setosa 876 459 564
#5 5.0 3.6 1.4 0.2 setosa 876 459 564
#6 5.4 3.9 1.7 0.4 setosa 876 459 564
# Petal.Width_sum Sepal.Length_mean Sepal.Width_mean Petal.Length_mean Petal.Width_mean
#1 180 5.84 3.06 3.76 1.2
#2 180 5.84 3.06 3.76 1.2
#3 180 5.84 3.06 3.76 1.2
#4 180 5.84 3.06 3.76 1.2
#5 180 5.84 3.06 3.76 1.2
#6 180 5.84 3.06 3.76 1.2
B. 2 Ręcznie określ nowe nazwy kolumn
Inną opcją, przy użyciu więcej niż 1 funkcji, jest samodzielne określenie rozszerzenia nazwy kolumny:
iris %>% mutate_each(funs(MySum = sum(.), MyMean = mean(.)), -Species) %>% head()
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species Sepal.Length_MySum Sepal.Width_MySum Petal.Length_MySum
#1 5.1 3.5 1.4 0.2 setosa 876 459 564
#2 4.9 3.0 1.4 0.2 setosa 876 459 564
#3 4.7 3.2 1.3 0.2 setosa 876 459 564
#4 4.6 3.1 1.5 0.2 setosa 876 459 564
#5 5.0 3.6 1.4 0.2 setosa 876 459 564
#6 5.4 3.9 1.7 0.4 setosa 876 459 564
# Petal.Width_MySum Sepal.Length_MyMean Sepal.Width_MyMean Petal.Length_MyMean Petal.Width_MyMean
#1 180 5.84 3.06 3.76 1.2
#2 180 5.84 3.06 3.76 1.2
#3 180 5.84 3.06 3.76 1.2
#4 180 5.84 3.06 3.76 1.2
#5 180 5.84 3.06 3.76 1.2
#6 180 5.84 3.06 3.76 1.2
Jak mogę wybrać pewne kolumny, które chcę zmutować, tak jak to zrobiłem z select w pierwszym case?
Możesz to zrobić, odwołując się do kolumn, które mają być zmutowane (lub pominięte), podając ich nazwy jak tutaj (mutate Sepal.Długość, ale nie Gatunek): {]}
iris %>% mutate_each(funs(sum), Sepal.Length, -Species) %>% head()
Dodatkowo, możesz użyć funkcji specjalnych, aby wybrać kolumny, które mają być zmutowane, wszystkie kolumny, które zaczynają się lub zawierają określone słowo itp., używając na przykład:
iris %>% mutate_each(funs(sum), contains("Sepal"), -Species) %>% head()
Aby uzyskać więcej informacji o tych funkcjach, zobacz ?mutate_each
i ?select
.
Edit 1 after comment:
Jeśli chcesz użyć Standard evaluation, dplyr dostarcza SE-wersje większości funkcji kończące się dodatkowym"_". Więc w tym przypadku można użyć:
x <- c("Sepal.Width", "Sepal.Length") # vector of column names
iris %>% mutate_each_(funs(sum), x) %>% head()
Zwróć uwagę na mutate_each_
używałem tutaj.
Edycja 2: Aktualizacja z opcją a. 4
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-16 08:20:52
mutate_each
będzie przestarzały, rozważ użycie mutate_at
. Z dplyr_0.5.0
dokumentacji:
W przyszłości mutate_each() i summarise_each () zostaną wycofane na rzecz bardziej rozbudowanej rodziny funkcji: mutate_all (), mutate_at (), mutate_if (), summarise_all (), summarise_at () i summarise_if ().
Zastosuj funkcję do wszystkich zmiennych z wyjątkiem Species
:
Ostrzeżenie:".param cols jest przestarzały, patrz notka na dole!
iris %>% mutate_at(.cols=vars(-Species), .funs=funs(mysum = sum(.))) %>% head()
Sepal.Length Sepal.Width Petal.Length Petal.Width Species Sepal.Length_mysum Sepal.Width_mysum
1 5.1 3.5 1.4 0.2 setosa 876.5 458.6
2 4.9 3.0 1.4 0.2 setosa 876.5 458.6
3 4.7 3.2 1.3 0.2 setosa 876.5 458.6
4 4.6 3.1 1.5 0.2 setosa 876.5 458.6
5 5.0 3.6 1.4 0.2 setosa 876.5 458.6
6 5.4 3.9 1.7 0.4 setosa 876.5 458.6
Petal.Length_mysum Petal.Width_mysum
1 563.7 179.9
2 563.7 179.9
3 563.7 179.9
4 563.7 179.9
5 563.7 179.9
6 563.7 179.9
Apply a funkcja do podzbioru zmiennych
vars_to_process=c("Petal.Length","Petal.Width")
iris %>% mutate_at(.cols=vars_to_process, .funs=funs(mysum = sum(.))) %>% head()
Sepal.Length Sepal.Width Petal.Length Petal.Width Species Petal.Length_mysum Petal.Width_mysum
1 5.1 3.5 1.4 0.2 setosa 563.7 179.9
2 4.9 3.0 1.4 0.2 setosa 563.7 179.9
3 4.7 3.2 1.3 0.2 setosa 563.7 179.9
4 4.6 3.1 1.5 0.2 setosa 563.7 179.9
5 5.0 3.6 1.4 0.2 setosa 563.7 179.9
6 5.4 3.9 1.7 0.4 setosa 563.7 179.9
Aktualizacja! dla wersji dplyr 0.7.1 (2017-08-08)
Jeśli widzisz wiadomość:
.cols
nazwa została zmieniona i jest przestarzała, Proszę użyć.vars
Następnie zmień .cols
przez .vars
.
iris %>% mutate_at(.vars=vars(-Species), .funs=funs(mysum = sum(.))) %>% head()
Inny przykład:
iris %>% mutate_at(.vars=vars(Sepal.Width), .funs=funs(mysum = sum(.))) %>% head()
Jest równoważne:
iris %>% mutate_at(.vars=vars("Sepal.Width"), .funs=funs(mysum = sum(.))) %>% head()
Również w tej wersji mutate_each
jest przestarzałe:
mutate_each()
jest przestarzały. Użyciemutate_all()
,mutate_at()
albomutate_if()
zamiast tego. Na Mapafuns
nad wyborem zmiennych, użyjmutate_at()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-04 06:28:59