각 열이 많은 값을 가질 수있는 문자형 벡터 인 "T"를 고려하십시오.
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_)