r - 在带有函数参数中的命名变量的函数中使用pivot_wider

标签 r tidyverse tidyr rlang

我正在尝试在函数内使用pivot_wider。这些值不是唯一定义的,因此我需要指定pivot_wider的values_fn参数,它应该返回一个列表。 value_fn 的列是函数的参数。

这是一个最小的例子:

library(rlang)
library(tidyverse)

t <- tibble::tibble(a = c(rep("A", 2), rep("B", 3), "C"), 
                    b = seq(1:6))

# This works without a function
t %>% tidyr::pivot_wider(names_from = a, 
                         values_from = b, 
                         values_fn =  list(b = list))

# Now I want to do the same with a function. But the := is not valid in the values_fn.

pivot_func <- function(dat, name_col, value_col){
  dat %>% 
    tidyr::pivot_wider(names_from = {{name_col}}, 
                       values_from = {{value_col}}, 
                       values_fn = list({{value_col}} := list))
}

pivot_func(t, a, b)

错误:“:=”只能在准引号参数中使用运行“rlang::last_error()”以查看发生错误的位置。

最佳答案

该错误告诉您您正在非准引号参数内使用 := 。这是因为您在函数 list 中使用它。此外,您正在使用 {{values_from}},但您的函数没有名为 values_from 的参数。

相反,您可以在管道之前创建所需的函数列表并将其传递给 values_fn:

pivot_func <- function(dat, name_col, value_col){
  fns <- setNames(list(list), deparse(substitute(value_col)))
  dat %>% 
    tidyr::pivot_wider(names_from = {{name_col}}, 
                       values_from = {{value_col}}, 
                       values_fn = fns)
}

pivot_func(t, a, b)
#> # A tibble: 1 x 3
#>   A         B         C        
#>   <list>    <list>    <list>   
#> 1 <int [2]> <int [3]> <int [1]>

或者,如果您想坚持 rlang 语法,您可以执行以下操作:

pivot_func <- function(dat, name_col, value_col){
  
  dat %>% 
    tidyr::pivot_wider(names_from = {{name_col}}, 
                       values_from = {{value_col}}, 
                       values_fn = setNames(list(list), 
                                            expr_deparse(enexpr(value_col))))
}

它做同样的事情。

关于r - 在带有函数参数中的命名变量的函数中使用pivot_wider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71423206/

相关文章:

r - 使用 ggvis 对数比例和限制

将四开本呈现为 HTML 指定输出位置缺少绘图和样式

r - 每第 n 列将数据帧拆分为多个

r - 在 R 中划分行

r - 使用 dplyr : Renaming a column with variable using glue syntax 编程

r - 在 R 中获取 data.frame 的样本

r - 涉及行特定和整组元素的组特定计算

r - 是否有比使用三重感叹号选择更强大的重命名替代方案?

r - 如何对宽 R 数据框中的列和行求和?

R 多款多功能