【问题标题】:Using quosures within vars argument of mutate_at在 mutate_at 的 vars 参数中使用 quosures
【发布时间】:2017-10-09 10:25:47
【问题描述】:

我想编写一个简单的函数,该函数将利用 mutate_at 调用中通过省略号传递的 quosures。

# 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 &lt;- quos(...) 中最新使用的省略号参数。

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

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

【问题讨论】:

    标签: r function dplyr rlang


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,我不知道我不必打破限制,并且可以在没有 !!!rlang::(...) 的情况下通过 mut_vars 。关于你的问题,这个例子是概要的。在我的实际管道中,我还有其他经常应用的操作,因此将它们包装在一个通用函数中是有意义的。当然,如果没有其他功能,将 mutate_at 包裹在 mutate_some 中是没有意义的。
    猜你喜欢
    • 1970-01-01
    • 2022-10-12
    • 2022-01-08
    • 1970-01-01
    • 2018-10-07
    • 2018-01-19
    • 1970-01-01
    • 2017-01-05
    相关资源
    最近更新 更多