1
我想寫一個簡單的函數,它可以使用通過調用mutate_at
中的省略號傳遞的變量。在變量中使用變量參數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
爲quos()
,因爲我稍後使用它。我不想更改列名(如上面所需的結果)。
感謝的結果,我沒有不知道我不必打破這些問題,只需傳遞'mut_vars'就可以不使用**'''**或**'rlang ::(...)'**。關於你的問題,這個例子是天氣。在我的實際管道中,我經常應用其他操作,因此將它們包裝在一個通用函數中是有意義的。當然,沒有其他函數將'mutate_at'包裝在'mutate_some'中是沒有意義的。 – Konrad