4

我正在尝试编写一个函数,该函数将用户的列名向量作为其参数之一。列名将用于指定数据框的哪些列将被粘贴在一起以在 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)
}
4

3 回答 3

8

因为您有一个字符串列表,所以您可以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
于 2017-08-15T15:18:31.450 回答
1

使用团结。

names <- iris %>% colnames()
iris %>% mutate(new = paste(names)) #Error
iris %>% unite("new",names,remove=F) #OK
于 2020-10-16T06:35:13.657 回答
0

使用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)
于 2017-08-15T08:34:50.423 回答