我是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))
有人可以向我解释我在做什么错吗?
答案 0 :(得分:0)
使用dplyr
进行编程现在使用一个昵称为“ tidyeval”的系统,该系统控制何时“评估”变量与何时“引用”变量。
https://dplyr.tidyverse.org/articles/programming.html
以下是一些直接针对应用程序的“食谱”: https://edwinth.github.io/blog/dplyr-recipes/
要在此处使用tidyeval,您需要使用函数来指定要对哪一列进行操作。然后执行两个步骤:
使用enquo
将名称转换为“ 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