Использовать имена столбцов в функциях из mutate(across()) в R

#r #dplyr #across

#r #dplyr #через

Вопрос:

Я пытаюсь сравнить col с col_new в моих данных и создать новый логический идентификатор с именем change_col, который идентифицирует изменения.

Ниже приведен пример:

 input <- data.frame(
  apple = c(1,2)
  ,apple_new = c(2,3)
  ,banana = c(1,2)
  ,banana_new = c(1,3)
)

desired_output <- data.frame(
  apple = c(1,2)
  ,apple_new = c(2,3)
  ,change_apple = c(TRUE,TRUE)
  ,banana = c(1,2)
  ,banana_new = c(1,3)
  ,change_banana = c(FALSE,TRUE)
)
  

Я подумываю об использовании mutate вместе с across для перебора яблок и бананов, но это не удалось… У кого-нибудь есть идея получше?

 library(dplyr)

var_to_consider <- c('apple','banana')

input %>%
  mutate( across(c(var_to_consider), 
                 .fns = list(change = ~ . != !!sym(paste0(.,'_new') )),
                 .names = "{fn}_{col}" ) )
  

Приведенное выше приведет к следующей ошибке:

 Error: Only strings can be converted to symbols
  

Ответ №1:

Это можно сделать с помощью прямого сравнения.

 var <- c('apple','banana')
input[paste0('change_', var)] <- input[var] != input[paste0(var, '_new')]

#  apple apple_new banana banana_new change_apple change_banana
#1     1         2      1          1         TRUE         FALSE
#2     2         3      2          3         TRUE          TRUE