各列が多くの値をとることができる文字ベクトルであるティブルを考えてみましょう-「A」から「F」までとしましょう。
library(tidyverse)
sample_df <- tibble(q1 = c("A", "B", "C"), q2 = c("B", "B", "A"))
引数として列名を取り、その列を再コード化して、回答「A」がNAになり、それ以外の場合はdfがそのまま返されるようにする関数を作成したいと思います。このように設計する理由は、特定の列を使用して一連の操作を実行するより広範なパイプラインに適合するためです。
これを行うには多くの方法があります。しかし、私は、慣用的なtidy_eval / tidyverseアプローチが何であるかを理解することに興味があります。まず、質問名はmutate動詞の左側にある必要があるため、!!
and :=
演算子を適切に使用します。しかし、それでは右側に何を置くべきでしょうか?
fix_question <- function(df, question) {
df %>% mutate(!!question := recode(... something goes here...))
}
fix_question(sample_df, "q1") # should produce a tibble whose first column is (NA, "B", "C")
私の最初の考えはこれがうまくいくと思いました:
df %>% mutate(!!question := recode(!!question, "A" = NA_character_))
ただし、関数内のbang-bangは、リテラル文字列(たとえば "q1")を返すだけです。私は、基本的なR [[
演算子を使用し、.
dplyrからの構成に依存して、右側のデータを参照するためにハッキーなルートのように感じることになり、それが機能するので、ある意味で根本的な問題を解決しました:
df %>% mutate(!!question := recode(.[[question]], "A" = NA_character_))
これを行うためのより慣用的な方法があるかどうかについて、tidyevalが非常に得意な人からフィードバックを得ることに興味があります。実際に動作する例を見れば、tidyeval関数セットの理解がより一般的になると期待しています。何かご意見は?
q1
(シンボル)と"q1"
:(文字列)df %>% mutate_at( vars(!!ensym(question)), recode, A = NA_character_)