【问题标题】:Pass vector of column names to paste() within mutate (dplyr)将列名向量传递给 mutate (dplyr) 中的 paste()
【发布时间】:2017-08-15 03:56:42
【问题描述】:

我正在尝试编写一个函数,该函数将来自用户的列名向量作为其参数之一。列名将用于指定数据框的哪些列将被粘贴在一起以在 dplyr::mutate 中形成一个新列。我试图先折叠参数向量的元素,然后在 mutate 中使用折叠的字符串 - 这是错误的。请参阅下面的最新尝试。我进行了其他尝试,但我不了解 dplyr 中的新 quo、enquo、UQ、!!!、!! 等等。有人可以显示我需要做什么吗?

df <- data.frame(.yr = c("2000", "2001", "2002"), .mo = c("12", "01", "02"), .other = rnorm(3))
cols <- colnames(df)[1:2]

do_want <- df %>%
  mutate(new = paste(.yr, .mo, sep = "-"))

my_func <- function(dat, vars){
  .vars <- paste(vars, collapse = ",")

  result <- dat %>%
    mutate(new = paste(.vars, sep = "-" ))
  return(result)
}

my_func(dat = df, vars = cols)

编辑:这是我尝试使用 quo 和 !!在函数定义中。结果是一列重复的字符串 ".yr,.mo"

my_func <- function(dat, vars){
  .vars <- quo(paste(vars, collapse = ","))

  result <- dat %>%
    mutate(new = paste(!!.vars, sep = "-" ))
  return(result)
}

【问题讨论】:

    标签: r dplyr rlang


    【解决方案1】:

    因为您有一个字符串列表,您可以在函数中使用rlang::syms 来获取字符串并将它们转换为符号。然后你可以使用!!!将参数拼接在一起放入paste

    my_func <- function(dat, vars){
         .vars <- rlang::syms(vars)
    
         result <- dat %>%
              mutate(new = paste(!!!.vars, sep = "-" ))
         return(result)
    }
    
    my_func(dat = df, vars = cols)
    
       .yr .mo     .other     new
    1 2000  12 -0.2663456 2000-12
    2 2001  01  0.5463433 2001-01
    3 2002  02 -1.3133078 2002-02
    

    【讨论】:

    • @Jelena-bioinf 如果您想使用 dplyr 进行编程,我不知道如何绕过感叹号。如果您还没有,请参阅here。不过,您绝对可以避免在 dplyr 之外工作或不编写函数!
    • 是的,dplyr 在函数之外工作时是如此美丽。但是当你需要以基于函数的方式来做时,它就失去了一致性和优雅性..
    【解决方案2】:

    使用团结。

    names <- iris %>% colnames()
    iris %>% mutate(new = paste(names)) #Error
    iris %>% unite("new",names,remove=F) #OK
    

    【讨论】:

      【解决方案3】:

      使用mutate_ 而不是mutate 并将表达式转换为对我有用的字符串:

      dplyr_solution <- function(dat, vars){
        .vars <- paste(vars, collapse = ",")
      
        result <- dat %>%
          mutate_(new = paste0('paste(', .vars, ', sep="-")'))
        return(result)
      }
      
      dplyr_solution(dat = df, vars = cols)
      

      【讨论】:

      • 谢谢 - 我有这样的尝试,但没有用引号将内部粘贴包裹起来。这行得通,仍然希望有人能展示一个利用新的 rLang 功能的解决方案,这使得 mutate_ 变得多余,并且比 3 个嵌套粘贴更优雅。
      • mutate_ 等现在在 dplyr 中已弃用。
      猜你喜欢
      • 1970-01-01
      • 2014-12-17
      • 2015-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-20
      • 2018-01-15
      • 2019-06-07
      相关资源
      最近更新 更多