Ответ 1
Обновление для dplyr >= 0.4.3.9000
В версии dplyr версии 0.4.3.9000 (на момент написания) именование внутри mutate_each
и summarise_each
было упрощено, как указано в News:
Имена поведения
summarise_each()
иmutate_each()
были чтобы вы могли принудительно включить как функцию, так и имя переменной:summarise_each(mtcars, funs(mean = mean), everything())
Это в основном важно, если вы хотите применить только 1 функцию внутри mutate_each
/summarise_each
, и вы хотите присвоить этим столбцам новые имена.
Чтобы показать разницу, здесь вывод dplyr 0.4.3.9000 с использованием новой функции именования, в отличие от опции a.2 ниже:
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
Если вы не укажете новые имена и вы будете поставлять только 1 функцию, dplyr изменит существующие столбцы (как это было в предыдущих версиях):
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
Я предполагаю, что эта новая функциональность будет доступна через CRAN в следующей версии версии 0.4.4.
dplyr verions <= 0.4.3:
Как я могу дать этим новым столбцам соответствующие имена, как я могу в мутировать?
a) 1 функция, примененная в mutate_each
/summarise_each
Если вы применяете только одну функцию внутри mutate_each
или summarise_each
, существующие столбцы будут преобразованы, и имена будут сохранены, как они были раньше, если вы не передадите именованный вектор в mutate_each_
/summarise_each_
(см. вариант a.4)
Вот несколько примеров:
a.1 только 1 функция → сохранит существующие имена
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 также, если вы указали новое расширение имени столбца:
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 Вручную укажите новое имя для столбца (но только для нескольких столбцов):
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 Используйте именованный вектор для создания дополнительных столбцов с новыми именами:
case 1: сохранить исходные столбцы
В отличие от опций a.1, a.2 и a.3, dplyr будет сохранять существующие столбцы без изменений и создавать новые столбцы в этом подходе. Имена новых столбцов равны именам именованного вектора, который вы создаете заранее (vars
в этом случае).
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
case 2: удалить исходные столбцы
Как вы можете видеть, этот подход сохраняет существующие столбцы без изменений и добавляет новые столбцы с указанными именами. Если вы не хотите сохранять исходные столбцы, а только только что созданные столбцы (и другие столбцы), вы можете просто добавить инструкцию select
:
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) более 1 функции, примененной в mutate_each
/summarise_each
b.1 Пусть dplyr выведет новые имена
Если вы применили более 1 функции, вы можете позволить dplyr вывести имена самостоятельно (и сохранить существующие столбцы):
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 Вручную укажите новые имена столбцов
Другой вариант, когда используется более 1 функции, заключается в том, чтобы указать расширение имени столбца самостоятельно:
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
Как я могу выбрать определенные столбцы, которые я хочу изменить, например, я сделал с выбором в первом случае?
Вы можете сделать это, указав столбцы, которые будут мутированы (или опущены), указав их имена, как здесь (mutate Sepal.Length, но не виды):
iris %>% mutate_each(funs(sum), Sepal.Length, -Species) %>% head()
Кроме того, вы можете использовать специальные функции для выбора столбцов, подлежащих мутации, всех столбцов, которые начинаются с или содержат определенное слово и т.д., используя, например:
iris %>% mutate_each(funs(sum), contains("Sepal"), -Species) %>% head()
Дополнительные сведения об этих функциях см. в разделе ?mutate_each
и ?select
.
Изменить 1 после комментария:
Если вы хотите использовать стандартную оценку, dplyr поставляет SE-версии большинства функций, заканчивающихся добавочным "_". Поэтому в этом случае вы будете использовать:
x <- c("Sepal.Width", "Sepal.Length") # vector of column names
iris %>% mutate_each_(funs(sum), x) %>% head()
Обратите внимание на mutate_each_
, который я использовал здесь.
Изменить 2: обновлено с помощью опции a.4