мутировать каждый / суммировать каждый в dplyr: как выбрать определенные столбцы и дать новые имена мутированным столбцам?
Я немного запутался в dplyr глагол mutate_each.
это довольно просто использовать основные mutate чтобы преобразовать столбец данных в, скажем, z-оценки и создать новый столбец в ваших данных.кадр (здесь с именем z_score_data):
newDF <- DF %>%
select(one_column) %>%
mutate(z_score_data = one_column - (mean(one_column) / sd(one_column))
однако, поскольку у меня есть много столбцов данных, которые я хотел бы преобразовать, похоже, мне следует использовать mutate_each глагол.
newDF <- DF %>%
mutate_each(funs(scale))
пока все хорошо. Но пока я не смог понять выход:
- как я могу дать этим новым столбцам соответствующие имена, как я могу в
mutate? - как я могу выбрать определенные столбцы, которые я хочу мутировать, как я сделал с
selectв первом случае?
Спасибо за вашу помощь.
2 ответов:
обновление для dplyr >= 0.4.3.9000
в версии разработки dplyr 0.4.3.9000 (на момент написания статьи), именование внутри
mutate_eachиsummarise_eachбыл упрощен, как отмечено в Новости:поведение именование
summarise_each()иmutate_each()была изменена таким образом, что вы можете принудительно включить как функцию, так и имя переменной:summarise_each(mtcars, funs(mean = mean), everything())это в основном важно, если вы хотите применить только 1 функция внутри
mutate_each/summarise_eachи вы хотите дать этим столбцам новые имена.чтобы показать разницу, вот выход из dplyr 0.4.3.9000 с использованием новой функции именования, в отличие от option а.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
как я могу дать этим новым столбцам соответствующие имена, как я могу в мутировать?
a) 1 функция применяется в
mutate_each/summarise_eachесли вы применяете только 1 функцию внутри
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 setosaa. 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 setosaa.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 459a. 4 Используйте именованный вектор для создания дополнительных столбцов с новыми именами:
корпус 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случай 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.6b) более 1 функции применяется в
mutate_each/summarise_eachb. 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б.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как я могу выбрать определенные столбцы, которые я хочу мутировать, как я сделал с выбором в первом случае?
вы можете сделать это, ссылаясь на столбцы, которые будут мутировать (или опущены), давая их имена, как здесь (мутировать Sepal.Длина, но не вид):
iris %>% mutate_each(funs(sum), Sepal.Length, -Species) %>% head()In кроме того, вы можете использовать специальные функции для выбора столбцов, которые будут видоизменены, всех столбцов, которые начинаются с или содержащие определенное слово и т. д. Например:
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: обновлен вариант.4
mutate_eachбудет устаревшим, рассмотрите возможность использованияmutate_at. Отdplyr_0.5.0документы:в будущем mutate_each() и summarise_each () будут осуждены в пользу более характерного семейства функций: mutate_all (), mutate_at (), mutate_if (), summarise_all (), summarise_at () и summarise_if ().
применить функцию ко всем переменным, кроме
Species:предупреждение: '.параметр cols устарел, см. Примечание На странице дно!
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применить функцию к подмножеству переменных
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обновление! для версии dplyr 0.7.1 (2017-08-08)
если вы видите сообщение:
.colsбыл переименован и устарел, пожалуйста, используйте.varsзатем измените
.colsby.vars.iris %>% mutate_at(.vars=vars(-Species), .funs=funs(mysum = sum(.))) %>% head()еще пример:
iris %>% mutate_at(.vars=vars(Sepal.Width), .funs=funs(mysum = sum(.))) %>% head()эквивалентно:
iris %>% mutate_at(.vars=vars("Sepal.Width"), .funs=funs(mysum = sum(.))) %>% head()кроме того, в этой версии
mutate_eachустарел:
mutate_each()устарела. Используйтеmutate_all(),mutate_at()или . На картуfunsдля выбора переменных используйтеmutate_at()
Comments