【问题标题】:dplyr programming using mutate使用 mutate 进行 dplyr 编程
【发布时间】:2018-11-17 16:31:37
【问题描述】:

我正在努力使用 dplyr 和 mutate 进行编程。

下面是一个可重现的例子。

library(tidyverse)
test <- tibble(a=1:10, b=1:10)

mute_function <- function(var, table) {

  quo_var <- enquo(var)

  sub_tb <-
    table %>%
    dplyr::select(!!quo_var, b) %>%
    mutate(new_var=!!quo_var)

  return(sub_tb)
}

应用函数时

mute_function(var = "a", table = test)

我明白了:

# A tibble: 10 x 3
       a     b new_var
   <int> <int> <chr>  
 1     1     1 a      
 2     2     2 a      
 3     3     3 a      
 4     4     4 a      
 5     5     5 a      
 6     6     6 a      
 7     7     7 a      
 8     8     8 a      
 9     9     9 a      
10    10    10 a  

我想获得一个新变量,它结合了 a 和其他变量的值。 在上述情况下,我期望 new_vara 相同。

显然,以下方法不起作用:

mute_function <- function(var, table) {

  quo_var <- enquo(var)

  sub_tb <-
    table %>%
    dplyr::select(!!quo_var, b) %>%
    mutate(new_var=!!quo_var/b)

  return(sub_tb)
}

 mute_function(var = "a", table = test)

我不明白为什么我一直在仔细阅读 dplyr vignette 进行编程。

提前感谢您的帮助

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    如果我们传递一个字符串,使用sym 转换为symbol 而不是quosure

    mute_function <- function(var, table) {
    
      quo_var <- rlang::sym(var)
    
      sub_tb <-
        table %>%
        dplyr::select(!!quo_var, b) %>%
        mutate(new_var=!!quo_var/b)
    
      return(sub_tb)
    }
    
    out <- mute_function(var = "a", table = test)
    out
    # A tibble: 10 x 3
    #       a     b new_var
    #   <int> <int>   <dbl>
    # 1     1     1       1
    # 2     2     2       1
    # 3     3     3       1
    # 4     4     4       1
    # 5     5     5       1
    # 6     6     6       1
    # 7     7     7       1
    # 8     8     8       1
    # 9     9     9       1
    #10    10    10       1
    

    但是,如果目标是传递不带引号的参数,则 OP 的函数应该可以正常工作

    mute_function(var = a, table = test)
    

    但是,我们可以同时传递带引号和不带引号的字符串

    mute_function <- function(var, table) {
    
      quo_var <- rlang::parse_expr(quo_name(enquo(var)))
    
      sub_tb <-
        table %>%
        dplyr::select(!!quo_var, b) %>%
        mutate(new_var=!!quo_var/b)
    
      return(sub_tb)
    }
    
    out1 <- mute_function(var = "a", table = test)
    out2 <- mute_function(var = a, table = test)
    identical(out1, out2)
    #[1] TRUE
    identical(out, out1)
    #[1] TRUE
    

    【讨论】:

      猜你喜欢
      • 2017-12-23
      • 2014-02-23
      • 2023-03-08
      • 1970-01-01
      • 2015-05-02
      • 2018-05-04
      • 2016-01-28
      • 1970-01-01
      相关资源
      最近更新 更多