Я пытаюсь ознакомиться с использованием NSE в моем коде, где это оправдано. Допустим, у меня есть пары столбцов, и я хочу создать новую строковую переменную для каждой пары, указывающую, совпадают ли значения в этой паре.
library(tidyverse)
library(magrittr)
df <- tibble(one.x = c(1,2,3,4),
one.y = c(2,2,4,3),
two.x = c(5,6,7,8),
two.y = c(6,7,7,9),
# not used but also in df
extra = c(5,5,5,5))
Я пытаюсь написать код, который будет выполнять то же самое, что и следующий код:
df.mod <- df %>%
# is one.x the same as one.y?
mutate(one.x_suffix = case_when(
one.x == one.y ~ "same",
TRUE ~ "different")) %>%
# is two.x the same as two.y?
mutate(two.x_suffix = case_when(
two.x == two.y ~ "same",
TRUE ~ "different"))
df.mod
#> # A tibble: 4 x 6
#> one.x one.y two.x two.y one.x_suffix two.x_suffix
#> <dbl> <dbl> <dbl> <dbl> <chr> <chr>
#> 1 1. 2. 5. 6. different different
#> 2 2. 2. 6. 7. same different
#> 3 3. 4. 7. 7. different same
#> 4 4. 3. 8. 9. different different
В моих реальных данных у меня есть произвольное количество таких пар (например, three.x
и three.y
,...), поэтому я хочу написать более обобщенную процедуру, используя mutate_at
.
Моя стратегия состоит в том, чтобы передать переменные «.x» как .vars
, а затем gsub
«x» вместо «y» на одной стороне проверки на равенство внутри case_when
, например:
df.mod <- df %>%
mutate_at(vars(one.x, two.x),
funs(suffix = case_when(
. == !!sym(gsub("x", "y", deparse(substitute(.)))) ~ "same",
TRUE ~ "different")))
#> Error in mutate_impl(.data, dots): Evaluation error: object 'value' not found.
Это когда я получаю исключение. Похоже, часть gsub
работает нормально:
df.debug <- df %>%
mutate_at(vars(one.x, two.x),
funs(suffix = gsub("x", "y", deparse(substitute(.)))))
df.debug
#> # A tibble: 4 x 6
#> one.x one.y two.x two.y one.x_suffix two.x_suffix
#> <dbl> <dbl> <dbl> <dbl> <chr> <chr>
#> 1 1. 2. 5. 6. one.y two.y
#> 2 2. 2. 6. 7. one.y two.y
#> 3 3. 4. 7. 7. one.y two.y
#> 4 4. 3. 8. 9. one.y two.y
Здесь исключение вызывает операция !!sym()
. Что я сделал не так?
Создана 07 ноября 2018 г. с помощью пакета reprex (v0.2.1)