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

Я новичок в R и функции, которая создает первое различие при разных значениях запаздывания (см. Код ниже).

dt %>%
        arrange(GEO, LF.char, NAICS, new_date) %>%
        mutate(fd = VALUE -lag(VALUE), FD_percent = fd/lag(VALUE),
            fd3 = VALUE -lag(VALUE, 3), FD_percent3 = fd3/lag(VALUE,3)) 

Я пытаюсь создать что-то вроде:

dt %>%
  arrange(GEO, LF.char, NAICS, new_date) %>%
  mutate_FD()

Моя попытка написать функцию была

mutate_FD <- function(x){
  mutate(fd = x.VALUE -lag(x.VALUE), FD_percent = fd/lag(x.VALUE),
         fd3 = x.VALUE -lag(x.VALUE, 3), FD_percent3 = fd3/lag(x.VALUE,3)) 
}

, но я получаю следующую ошибку

Ошибка в mutate (fd = x.VALUE - lag (x.VALUE), FD_percent = fd / lag (x.VALUE),: объект 'x.VALUE' не найден Вызывается из: mutate (fd)= x.VALUE - отставание (x.VALUE), FD_percent = fd / lag (x.VALUE), fd3 = x.VALUE - отставание (x.VALUE, 3), FD_percent3 = fd3 / lag (x.VALUE, 3))

Может кто-нибудь объяснить мне, что я делаю не так?

1 Ответ

0 голосов
/ 16 октября 2018

При программировании с dplyr теперь используется система с псевдонимом «tidyeval», которая контролирует, когда переменная «оценивается» по сравнению с «кавычками».

https://dplyr.tidyverse.org/articles/programming.html

Вот некоторые «рецепты», которые попадают прямо в приложения: https://edwinth.github.io/blog/dplyr-recipes/

Чтобы использовать tidyeval здесь, вам понадобится ваша функция, чтобы указать, с каким столбцом работать.Затем два шага:

  1. преобразовать имя в "quosure", используя enquo.Я еще не понимаю технических деталей, но моя рабочая ментальная модель такова, что это похоже на помещение ваших параметров в «таблетку», чтобы их можно было безопасно проглотить с помощью вашей функции и активировать (т.е. оценить) позже.

  2. используйте !!, чтобы удалить цитату.

Вот как это может выглядеть для вашей функции:

mutate_FD <- function(x, val_col){
  val_quo = enquo(val_col)
  x %>%
    mutate(fd = !!val_quo -lag(!!val_quo), 
           FD_percent = fd/lag(!!val_quo),
           fd3 = !!val_quo -lag(!!val_quo, 3), 
           FD_percent3 = fd3/lag(!!val_quo,3)) 
}

В будущем было бы еще полезнее, если бы вы могли предоставить пример данных с вашим вопросом,Не имея этого, вот пример:

# Sample data
dt <- data.frame(GEO = runif(10, min = 0, max = 1000) %>% floor(),
                 value = runif(10, min = 0, max = 10) %>% floor())

# Using the function on the "dt" table, applying the function to the "value" column.
dt %>%
  mutate_FD(value)

   GEO value fd FD_percent fd3 FD_percent3
1  354     2 NA         NA  NA          NA
2  158     2  0  0.0000000  NA          NA
3  626     8  6  3.0000000  NA          NA
4  447     7 -1 -0.1250000   5   2.5000000
5  926     5 -2 -0.2857143   3   1.5000000
6  105     6  1  0.2000000  -2  -0.2500000
7  290     1 -5 -0.8333333  -6  -0.8571429
8  668     7  6  6.0000000   2   0.4000000
9  263     9  2  0.2857143   3   0.5000000
10 733     2 -7 -0.7777778   1   1.0000000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...