在dplyr中取消引用mutate函数右侧的变量名称

aas*_*ngh 6 r dplyr

我正在尝试使用dplyr和function创建一个用于创建滞后变量的函数。但是,问题是我找不到如何在mutate函数右侧取消引用变量名

mutate(dt,
    !!varname_t1 := !!varname_t0 # it does not work. 
)
Run Code Online (Sandbox Code Playgroud)

以下是我的真实例子。

答:这是示例数据。

df <- tibble(
  a = sample(5)
)

# A tibble: 5 x 1
      a
  <int>
1     3
2     5
3     4
4     1
5     2
Run Code Online (Sandbox Code Playgroud)

我想要这样的数据。

df <- df %>% mutate(a2 = lag(a1))

# A tibble: 5 x 2
     a1    a2
  <int> <int>
1     3    NA
2     1     3
3     5     1
4     2     5
5     4     2
Run Code Online (Sandbox Code Playgroud)

B.我创建了一个函数,但是它不起作用。我认为问题是这条线。在右侧,我不知道如何取消报价。

!!varname_t1 := !!varname_t0
Run Code Online (Sandbox Code Playgroud)

我的功能是这样的。

lag1_mutate <- function(dt, varname, time) { # time here is "after"

    # enquo 
    varname <- enquo(varname) 
    time1 <- enquo(time) 
    time0 <- time-1; time0 <- enquo(time0)

    # create the name of variables
    varname_t0 <- paste0(quo_name(varname), quo_name(time0)) 
    varname_t1 <- paste0(quo_name(varname), quo_name(time1))

    # check 
    print(varname_t0)
    print(varname_t1)

    # mutate        
    mutate(dt, 
        !!varname_t1 := !!varname_t0 # <-- problem, here
        # !!varname_t1 := lag(!!varname_t0) # produced only NAs
    )
}
Run Code Online (Sandbox Code Playgroud)

实际结果是这样的。

lag1_mutate(df, a, 2)

[1] "a1"
[1] "a2"
# A tibble: 5 x 2
      a    a2
  <int> <chr>
1     4    a1
2     1    a1
3     3    a1
4     2    a1
5     5    a1
Run Code Online (Sandbox Code Playgroud)

luk*_*keA 6

我认为您必须将RHS字符串转换为quosure,您可以symrlang软件包中进行处理。所以用

mutate(dt, !!varname_t1 := lag(!!rlang::sym(varname_t0)))
Run Code Online (Sandbox Code Playgroud)

然后你的函数会产生

lag1_mutate(df, a, 1)
# [1] "a0"
# [1] "a1"
# # A tibble: 5 x 2
#      a0    a1
#   <int> <int>
# 1     3    NA
# 2     4     3
# 3     1     4
# 4     5     1
# 5     2     5
Run Code Online (Sandbox Code Playgroud)

(您没有设置种子,所以我的小插曲值与您的不同。)

  • 老帖子,但除非我完全遗漏了一些东西,否则当我运行该解决方案时,我会收到错误消息“错误:`mutate()`列`a1`出现问题。i`a1 = lag(a0)`。x对象'a0'未找到” (2认同)