Dplyr与Tidyeval用于构建变量名。

4
我正在尝试构建一个函数,允许我对以特定前缀开头的列执行函数。 我正在努力弄清楚如何使名称计算正确。
我查看了 dplyr 网站上关于 编程 的内容,但无法完全弄清楚如何使其正确计算。
我正在使用 CRAN 上最新版本的 dplyr(v0.70),其中 @hadley 引入了 tidyeval 重现代码
library(tidyverse)

tbl1 <- tibble(
  urn = c(1 ,2 ,3 ),
  a_width = c(10,20,30),
  a_height = c(12,13,14),
  b_width = c(25,50,75),
  b_height = c(25,50,75)
)

my_mean <- function(x, group) {
  width <- paste0(quo_name(group), "_width")
  height <- paste0(quo_name(group), "_height")

  summarise(x, 
  !!paste0(group, "_mean_width") := mean(!!width),          
  !!paste0(group, "_mean_height") := mean(!!height)          
  )  
}

my_mean(tbl1, "a")

# # A tibble: 1 x 2
# a_mean_width a_mean_height
# <dbl>         <dbl>
#   1           NA            NA
# Warning messages:
#   1: In mean.default("a_width") :
#   argument is not numeric or logical: returning NA
# 2: In mean.default("a_height") :
#   argument is not numeric or logical: returning NA

1
我认为你在 summarise 命令中漏掉了一个逗号。 - amarchin
您说得对,逗号确实被漏掉了,但这更多是我打字不够仔细的原因,而不是问题的根本原因。 - Dan
当然,我只是想重现你的错误,但是由于缺少逗号,这变得不可能 :) - amarchin
1个回答

2

!!width 返回字符串 "a_width"。您需要执行 !!sym(width) 将其转换为名称。对于 !!height 也是类似的。


3
我认为你需要使用 !!sym(width) 而不是 sym(!!width) - aosmith
1
我收到一个错误,显示“找不到函数sym”。 - Dan
symrlang 包中的一个函数,这也是 dplyr 用于此类操作的函数。 - Hong Ooi
!!sym(width)就是它了。请随意编辑答案,我会确认的。 - Dan
目前不在电脑旁,已经编辑过了。 - Hong Ooi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接