Хотите стандартизировать все переменные, кроме одной, используя dplyr в R — объект не найден

#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() работает отлично. Не стесняйтесь использовать свои комментарии в качестве ответов, и я поддержу.