Использование пользовательской функции с Tidyverse - PullRequest
0 голосов
/ 15 сентября 2018

Я создал фиктивную функцию, чтобы получить задержку одной переменной, и я хочу использовать ее с другими tidyverse функциями.Это работает после того, как я звоню mutate, но не после звонка group_by.Выдает следующую ошибку: Error in mutate_impl(.data, dots) : Not compatible with STRSXP: [type=NULL].

Вот повторение:

#create a function to lag a selected variable
lag_func <- function(df, x) {
  mutate(df, lag = lag(df[,x])) 
}

#works
iris %>% 
  mutate(lead = lead(Petal.Length)) %>%
  lag_func('Petal.Length')

#doesn't work
iris %>%
  group_by(Species) %>%
  mutate(lead = lead(Petal.Length)) %>%
  lag_func('Petal.Length')

Есть идеи, что означает ошибка и / или как ее исправить?

1 Ответ

0 голосов
/ 15 сентября 2018

Лучший способ передать имя столбца в качестве аргумента функции tidyverse - преобразовать его в quosure, используя enquo(). Смотрите этот код:

lag_func <- function(df, x) {
  x <- enquo(x)
  mutate(df, lag = lag(!!x)) # !! is to evaluate rather than quoting (x)
}

Теперь давайте попробуем нашу функцию:

iris %>%
  group_by(Species) %>%
  mutate(lead = lead(Petal.Length)) %>%
  lag_func(Petal.Length)

# A tibble: 150 x 7
# Groups:   Species [3]
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species  lead   lag
          <dbl>       <dbl>        <dbl>       <dbl> <fct>   <dbl> <dbl>
 1          5.1         3.5          1.4         0.2 setosa    1.4  NA  
 2          4.9         3            1.4         0.2 setosa    1.3   1.4
 3          4.7         3.2          1.3         0.2 setosa    1.5   1.4
 4          4.6         3.1          1.5         0.2 setosa    1.4   1.3
 5          5           3.6          1.4         0.2 setosa    1.7   1.5
 6          5.4         3.9          1.7         0.4 setosa    1.4   1.4
 7          4.6         3.4          1.4         0.3 setosa    1.5   1.7
 8          5           3.4          1.5         0.2 setosa    1.4   1.4
 9          4.4         2.9          1.4         0.2 setosa    1.5   1.5
10          4.9         3.1          1.5         0.1 setosa    1.5   1.4
# ... with 140 more rows

Для получения дополнительной информации о том, как использовать tidyverse функции в ваших пользовательских функциях, смотрите здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...