2017-08-11 11 views
3

dplyrを使用して関数の列の名前を変更するのが難しいです。私はすでに非標準的な評価とenquo(例えば、http://dplyr.tidyverse.org/articles/programming.htmlChanging names of resulting variables in custom dplyr function)の使用に関する有益な投稿を見つけました。究極の目的は、各グループを要約するために関数を使用し、列の名前を元の変数名よりも意味のあるものに変更することです。dplyr 0.7+関数の名前を変更

ここにはコメントアウトされた行以外の単純な例があります。

library(tidyverse) 

myfunc <- function(df, groupvar, colvar, grouplab, collab) { 
    groupvar <- enquo(groupvar) 
    colvar <- enquo(colvar) 
    grouplab <- enquo(grouplab) # quo_name instead? 
    collab <- enquo(collab) # quo_name instead? 

t <- df %>% 
    select(!!groupvar, !!colvar) %>% 
    group_by(!!groupvar, !!colvar) %>% 
    summarise(
    Frequencies = length(!!colvar), 
    Percentages = length(!!colvar)/nrow(df) 
    ) %>% 
    mutate(
    Frequencies = scales::comma(Frequencies), 
    Percentages = scales::percent(Percentages) 
    ) #%>% 
# rename(
# (!!grouplab) = !!groupvar, # add a more descriptive grouping var label 
# (!!collab) = !!colvar) # add a more descriptive column var label 

# Error: unexpected '=' in: rename((!!grouplab) = " 

... # code to create an xtable, print it into LaTeX 
} 

myfunc <- (df = mtcars, groupvar = gear, colvar = cyl, grouplab = "Vehicle Gears", collab = "Vehicle Cylinders") 
# I purposely made grouplab and collab have a space in case that changes anything. 

機能の外では、関連する部分は、単純に読んでいました:mtcars <- mtcars %>% rename("Vehicle Cylinders" = cyl, "Vehicle Gears" = gear)

私は名前の変更は、それ以外の対関数の中でどのように動作するかにアップトリップ取得する必要があります。何かアドバイス?私は提案に開放されています。

更新
これを行う方法が1つあります。むしろ変数名を文字列に入れるのではなく、ここでその方法を知っていません。提案に開放されています。あなたが式のLHS上のプログラムで、割り当てられた名前にしたい場合

library(tidyverse) 
library(xtable) 
data(mtcars) 

t_groupedfreqprop <- function(df, groupvar, colvar, grouplab, collab, plotname) { 
groupvar2 <- rlang::sym(groupvar) 
colvar2 <- rlang::sym(colvar) 
grouplab <- rlang::sym(grouplab) 
collab <- rlang::sym(collab) 

t <- df %>% 
    select(!!groupvar2, !!colvar2) %>% 
    group_by(!!groupvar2, !!colvar2) %>% 
    summarise(
    Frequencies = length(!!colvar2), 
    Percentages = length(!!colvar2)/nrow(df) 
) %>% 
    mutate(
    Frequencies = scales::comma(Frequencies), 
    Percentages = scales::percent(Percentages) 
) %>% 
    rename(
    !!grouplab := !!rlang::sym(groupvar2), 
    !!collab := !!rlang::sym(colvar2) 
) 

# remainder of function removed 
} 

t_groupedfreqprop(df = mtcars, groupvar = "gear", colvar = "cyl", grouplab = "Vehicle Gears", collab = "Vehicle Cylinders") 

答えて

2

:=を使用してください。

x <- c("mpg", "cyl") 
xnew <- paste(x, 2, sep = ".") 
names(x) <- xnew 
rename(mtcars, !!!x) 
+0

おかげで、@Hong大井:

x <- "mpg" xnew <- "mpg2" rename(mtcars, !!xnew := !!rlang::sym(x)) 
Daniel

+0

はい、うまくいくはずですが、 'x'と' xnew'を引用するためには 'enquo'を使用しなければなりません。 * tidyeval * conceptの詳細については、 'dplyr'のプログラミング・ビネットを参照してください。 – cderv

+0

ありがとうございます。私はまだ何かが欠落しているに違いありません...関連する部分に関数をボイルするとエラーがスローされます: "エラー:文字列のみをシンボルに変換できます。"このビネットは役に立ちますが(https://cran.r-project.org/web/packages/rlang/vignettes/tidy-evaluation.html)、私はまだ関数内での作業方法には苦労しています。 t_groupedfreqprop < - 関数(DF、groupvar、grouplab){ groupvar < - enquo(groupvar) grouplab < - enquo(grouplab) T <- df %>% リネーム( !! grouplab:= !! rlang :: SYM (groupvar)) } t_groupedfreqprop(df = mtcars、groupvar = gear、grouplab = "Vehicle Gears") – Daniel

1

あなたは !!!を使用する必要があり、一度に複数の列の名前を変更します。この技術はまだ機能していますか?つまり、新しい名前をハードコードしていないのですか?
関連する問題