2017-08-15 11 views
3

私は、その引数の1つとしてユーザからの列名のベクトルをとる関数を記述しようとしています。列名は、dplyr :: mutate内に新しい列を作成するために、データフレームのどの列を貼り付けるかを指定するために使用されます。引数ベクトルの要素を最初に崩壊させてから、崩壊した文字列をmutateで使用しようとしました。これは間違っています。下の最新の試みを見てください。私は他の試みをしましたが、私はdplyr内で新しいquo、enquo、UQ、!!!、!!などを理解していません。誰かが私がする必要があることを示すことができますか?mutate(dplyr)内のpaste()にカラム名のベクトルを渡す

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を使って試みたものです。関数定義に追加します。結果は文字列に式を回す代わりにmutate &の使用mutate_繰り返し文字列の列にある「.yr、.moという」

my_func <- function(dat, vars){ 
    .vars <- quo(paste(vars, collapse = ",")) 

    result <- dat %>% 
    mutate(new = paste(!!.vars, sep = "-")) 
    return(result) 
} 

答えて

3

をあなたがリストを持っているので関数内で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 
0

私の仕事:

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) 
+0

ありがとうございます - 私はこのような試みをしましたが、内部のペーストを引用符で囲んでいませんでした。これはうまくいけば、3つのネストされたペーストよりもmutate_を余分にし、よりエレガントな新しいrLang機能を利用したソリューションを誰かが見せることを期待しています。 – mb158127

+1

'mutate_'などは廃止予定です。 –

関連する問題