#r #dplyr
#r #dplyr
Вопрос:
РЕДАКТИРОВАТЬ: этот вопрос теперь устарел с across()
rlang
набором инструментов.
Я использую набор данных о рейсах из пакета nycflights13 в качестве примера проблемы, с которой я столкнулся. Я хочу стандартизировать множество переменных, кроме одной (в случае приведенного ниже кода, переменной «year»).
library(nycflights13)
library(tidyverse)
flights2 <- flights %>% mutate_each_(funs(scale), -year)
Error in has_names(vars) : object 'year' not found
Что я делаю не так? Последующий вопрос: что мне делать, если я не хочу стандартизировать несколько переменных, таких как «год», «месяц» и «день»?
Комментарии:
1. Порядок ваших аргументов выглядит неправильно. Попробуйте это:
flights %>% mutate_at(vars(-year, -time_hour, -dest, -origin, -tailnum, -carrier), funs(scale))
(эти дополнительные удаленные переменные являются символьными строками). В более общем плане вы можете использоватьmutate_if
с соответствующей функцией предиката2. К ошибке: смотрите
?summarise_each
: «Для стандартных оценочных версий (заканчивающихся на _) эти [аргумент vars] могут быть либо списком выражений, либо символьным вектором». Так что вы могли бы, например, сделатьflights %>% mutate_each_(funs(scale), setdiff("year", names(flights)))
. Что приводит к следующей ошибке (scale
требуются числовые значения). Вы, вероятно, хотитеflights %>% mutate_if(is.numeric, scale)
илиflights %>% mutate_at(vars(-year, -month, -day), scale)
3. Спасибо @Chrisss и @lukeA —
mutate_at()
работает отлично. Не стесняйтесь использовать свои комментарии в качестве ответов, и я поддержу.