在dplyr中使用自定义mutate函数

时间:2018-10-16 19:31:22

标签: r dplyr mutate

我是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-滞后(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 :(得分:0)

使用dplyr进行编程现在使用一个昵称为“ tidyeval”的系统,该系统控制何时“评估”变量与何时“引用”变量。

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

以下是一些直接针对应用程序的“食谱”: https://edwinth.github.io/blog/dplyr-recipes/

要在此处使用tidyeval,您需要使用函数来指定要对哪一列进行操作。然后执行两个步骤:

  1. 使用enquo将名称转换为“ quosure”。我尚不了解技术细节,但是我的工作思维模型是,这就像将您的参数放入“药丸”中一样,以便您的功能可以安全地吞下它,并在以后激活(即评估)。

    < / li>
  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