在mutate_at的变量参数中使用quosures

时间:2017-10-09 10:25:47

标签: r function dplyr rlang

我想编写一个简单的函数,它将利用document.getElementById('iframe-id').src = newLink; 调用中通过省略号传递的quosures。

mutate_at

问题

代码产生:

# Packages
sapply(
    X = c("dplyr", "rlang"),
    FUN = require,
    character.only = TRUE
)

# Data
set.seed(1)
cbind(as.data.frame(replicate(3, replicate(
    10, paste0(sample(letters, 5), collapse = "")
))), c(1:10)) %>% setNames(nm = paste(replicate(4, "col"), LETTERS[1:4], sep = "_")) -> dta


# Mutate
mutate_some <- function(df, ...) {
    mut_vars <- quos(...)
    df %>%
        mutate(.vars = !!!mut_vars,
               .funs = funs(toupper(.)))
}

# test
dta %>% mutate_some(col_A, col_C)

期望的结果

结果应相当于:

>> dta %>% mutate_some(col_A, col_C)
   col_A col_B col_C col_D .vars1 .vars2       .funs
1  gjnue mvkfb rigwn     1  gjnue  rigwn ~toupper(.)
2  xzpob chmpi fdlvn     2  xzpob  fdlvn ~toupper(.)
3  feqix xhlyo zsijd     3  feqix  zsijd ~toupper(.)
4  mrxiy glsbt arcko     4  mrxiy  arcko ~toupper(.)
5  yfpcz iuzhk zmldq     5  yfpcz  zmldq ~toupper(.)
6  kajuh xvjry lmefn     6  kajuh  lmefn ~toupper(.)
7  moles lrjhq obazu     7  moles  obazu ~toupper(.)
8  rtcqj frczd pomwl     8  rtcqj  pomwl ~toupper(.)
9  vqsml gbpur rpfxq     9  vqsml  rpfxq ~toupper(.)
10 ualqp uljsn lerct    10  ualqp  lerct ~toupper(.)

假设:

  • dta %>% mutate_at(.funs = funs(toupper(.)), .vars = c("col_A", "col_C")) col_A col_B col_C col_D 1 GJNUE mvkfb RIGWN 1 2 XZPOB chmpi FDLVN 2 3 FEQIX xhlyo ZSIJD 3 4 MRXIY glsbt ARCKO 4 5 YFPCZ iuzhk ZMLDQ 5 6 KAJUH xvjry LMEFN 6 7 MOLES lrjhq OBAZU 7 8 RTCQJ frczd POMWL 8 9 VQSML gbpur RPFXQ 9 10 UALQP uljsn LERCT 10 函数必须采用mutate_some中使用的省略号参数。

  • 特别是,我正在寻找类似于mut_vars <- quos(...)的解决方案。此功能是较长管道的一部分,我需要将rlang::do_something_(mut_vars)保留为mut_vars,因为我稍后会使用它。

  • 我不想更改列名(如上面所需的结果)。

1 个答案:

答案 0 :(得分:1)

您似乎已经知道mutate_at功能,我不确定您为什么不在mutate_some中使用它,但它会产生您想要的结果

mutate_some <- function(df, ...) {
  mut_vars <- quos(...)
  df %>%
    mutate_at(mut_vars,
           .funs = funs(toupper(.)))
}