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źć:
  1. Jak mogę dać te nowe kolumny odpowiednie nazwy, jak Mogę w mutate?
  2. Jak mogę wybrać kolumny, które chcę zmutować, tak jak to zrobiłem z select w pierwszym przypadku?
Dzięki za pomoc.
Author: docendo discimus, 2014-11-20

2 answers

Aktualizacja dla dplyr >= 0.4.3.9000

W wersji rozwojowej dplyr 0.4.3.9000 (w momencie pisania) nazwy wewnątrz mutate_each i summarise_each zostały uproszczone, jak zauważono w News :

Zachowanie nazw summarise_each() i mutate_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

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

 100
Author: docendo discimus,
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życie mutate_all(), mutate_at() albo mutate_if() zamiast tego. Na Mapa funs nad wyborem zmiennych, użyj mutate_at()

 13
Author: pablo_sci,
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