2017-10-31 14 views
3

dplyr::left_join(およびfriends)のby引数には文字列のリストが必要です。私のコードでは、関心のある変数をすでにクォーチャのリストとして定義していますので、クォーチャのリストを文字列のリストに変換することで、リストをもう一度作成しないようにします。終了と文字列を文字列のリストに分割する

私はrlang文書の周りを狩りに行きましたが、既存の解決策は見つかりませんでした。機能のquo_expr家族スプライスと変換quosuresを単一の文字列ではなく、彼らは文字列のリストを生成しないことができます。ここでは

library(rlang) 

# this works 
sepal_length <- quo(Sepal.Length) 
quo_text(sepal_length) 

# this doesnt 
sepaldims <- quos(Species, Sepal.Length) 
quo_text(sepaldims) 

が、これは有用であろう例です:

library(dplyr) 

# group_by accepts a list of quosures 
sepaldims <- quos(Species, Sepal.Length) 
iris_sepal <- iris %>% 
    group_by(!!!sepaldims) %>% 
    summarize(sepal_width = mean(Sepal.Width), petal_width = mean(Petal.Width))  
petaldims <- quos(!!!sepaldims, Petal.Length) 
iris_petal <- iris %>% 
    group_by(!!!petaldims) %>% 
    summarize(sepal_width = mean(Sepal.Width), petal_width = mean(Petal.Width)) 

# but left join expects a list of strings 
iris_merge <- left_join(iris_sepal, iris_petal, by = c("Species", "Sepal.Length")) 

答えて

2

ソリューションI

quos_text <- function(qs) { 
    unlist(lapply(seq_along(qs), function(i) quo_text(qs[[i]]))) 
} 

は、今、私たちはquosuresのリストを扱うことができます:リストにquo_textを適用思い付いた

sepaldims <- quos(Species, Sepal.Length) 
petaldims <- quos(!!!sepaldims, Petal.Length) 

quos_text(sepaldims) 
quos_text(petaldims) 
quos_text(quos(!!!sepaldims, Petal.Width)) 

そしてleft_join満足している:

# these two are equivalent 
iris_merge <- left_join(iris_sepal, iris_petal, by = c("Species", "Sepal.Length")) 
iris_merge2 <- left_join(iris_sepal, iris_petal, by = quos_text(sepaldims)) 

@Mariusは、私たちが使用できるシンプルな形があることを指摘している:

sapply(qs, quo_text) 

これは私がおそらくインラインそれを使用します十分に短いですカスタム関数としてではなく、

+0

あなたの 'quos_text'関数は' sapply(qs、quo_text) 'に簡略化できると思います。 – Marius

+0

ありがとう@マリアス!それは私がちょうどそれをインラインで使うかもしれないほど短いです。 – Stanwood

関連する問題