【问题标题】:Using custom mutate function in dplyr在 dplyr 中使用自定义 mutate 函数
【发布时间】:2018-10-16 19:31:22
【问题描述】:

我是 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)) 
}

但我收到以下错误

变异错误(fd = x.VALUE - lag(x.VALUE), FD_percent = fd/lag(x.VALUE), : object 'x.VALUE' not found 调用自: 变异(fd = x.VALUE - 滞后(x.VALUE),FD_percent = fd/滞后(x.VALUE), fd3 = x.VALUE - 滞后(x.VALUE,3),FD_percent3 = fd3/滞后(x.VALUE, 3))

有人可以向我解释我做错了什么吗?

【问题讨论】:

  • 您需要共享您正在使用的数据框。分享dput(head(dt))的输出以及预期的输出。

标签: r dplyr


【解决方案1】:

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

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

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

要在此处使用 tidyeval,您需要您的函数来指定要操作的列。然后两步:

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

  2. 使用!! 取消引用quosure。

这是你的函数的外观:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2015-02-05
    • 2020-05-31
    • 2018-12-29
    • 1970-01-01
    相关资源
    最近更新 更多