2017-10-09 140 views
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_varsquos(),因爲我稍後使用它。

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

回答

1

你似乎已經意識到mutate_at功能的,我不知道爲什麼你是不是在你的mutate_some使用它,但它會產生你想要

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

感謝的結果,我沒有不知道我不必打破這些問題,只需傳遞'mut_vars'就可以不使用**'''**或**'rlang ::(...)'**。關於你的問題,這個例子是天氣。在我的實際管道中,我經常應用其他操作,因此將它們包裝在一個通用函數中是有意義的。當然,沒有其他函數將'mutate_at'包裝在'mutate_some'中是沒有意義的。 – Konrad