Dplyr условный столбец ifelse с векторным вводом

Я пытаюсь использовать новый подход языка NSE от dplyr для создания условного преобразования с использованием векторного ввода. Там, где у меня возникают проблемы, я устанавливаю столбец равным самому себе, см. Ниже:

df <- data.frame("Name" = c(rep("A", 3), rep("B", 3), rep("C", 4)), 
                 "X" = runif(1:10), 
                 "Y" = runif(1:10)) %>% 
    tbl_df() %>% 
    mutate_if(is.factor, as.character)

ColToChange <- "Name"
ToChangeTo <- "Big"

Теперь с помощью следующего:

df %>% mutate( !!ColToChange := ifelse(X >= 0.5 & Y >= 0.5, ToChangeTo, !!ColToChange))

Устанавливает ColToChange значение для Name, не возвращаясь к своей первоначальной стоимости. Таким образом, я пытаюсь использовать синтаксис выше для достижения этого:

df %>% mutate( !!ColToChange := ifelse(X >= 0.5 & Y >= 0.5, ToChangeTo, Name))

Но вместо NameПусть это будет вектор.

1 ответ

Решение

Вам нужно использовать rlang:sym оценить ColToChange как символ Name затем оцените его как столбец с !!:

library(rlang); library(dplyr);

df %>% mutate(!!ColToChange := ifelse(X >= 0.5 & Y >= 0.5, ToChangeTo, !!sym(ColToChange)))

# A tibble: 10 x 3
#    Name          X         Y
#   <chr>      <dbl>     <dbl>
# 1     A 0.05593119 0.3586310
# 2     A 0.70024660 0.4258297
# 3   Big 0.95444388 0.7152358
# 4     B 0.45809482 0.5256475
# 5   Big 0.71348123 0.5114379
# 6     B 0.80382633 0.2665391
# 7   Big 0.99618062 0.5788778
# 8   Big 0.76520307 0.6558515
# 9     C 0.63928001 0.1972674
#10     C 0.29963517 0.5855646
Другие вопросы по тегам