Как обрабатывать R eval с помощью трансмутации? - PullRequest
1 голос
/ 26 мая 2020

Я новичок в R. Я пытаюсь объединить некоторые столбцы в новый столбец. Поскольку в DF должны быть сохранены только агрегированные столбцы, я использую преобразование.

Поскольку имена столбцов могут отличаться, я пытаюсь объединить некоторые строки, чтобы создать фрагмент кода, а затем работаю с синтаксическим анализом и eval для работайте с этим кодом.

Часть, которую я собрал, это:

transmute("aggr1" = as.numeric(val1) + as.numeric(val2), "aggr2" = as.numeric(val3) + as.numeric(val4))

Если я создам новый фрейм данных, подобный этому, он будет работать отлично:

data_aggr <- df %>%
  transmute("aggr1" = as.numeric(val1) + as.numeric(val2), "aggr2" = as.numeric(val3) + as.numeric(val4))

Но если строка, которую я собрал, выглядит так:

composed = "transmute(\"aggr1\" = as.numeric(val1) + as.numeric(val2), \"aggr2\" = as.numeric(val3) + as.numeric(val4))"

, а затем я использую:

data_aggr <- df %>%
  eval(parse(text=composed))

, это не сработает. Я получаю сообщение об ошибке:

error in mutate(.data, !!!dots)

Возможно ли моё решение. Я что-то не так делаю?

1 Ответ

1 голос
/ 26 мая 2020

Как правило, вы почти никогда не хотите использовать parse и eval в обычном коде - фактически, их присутствие должно быть предупреждением о том, что вы думаете о проблеме неправильно. Это специализированные инструменты для низкоуровневого программирования R, которые должны полностью отсутствовать в коде анализа.

Во-первых, в вашем коде вероятной причиной путаницы является использование двойных кавычек вокруг имен столбцов, поэтому вы думаете, что они струны. На самом деле это не так! R молча принимает строковые литералы в нескольких местах вместо имен переменных, и обрабатывает их как имена переменных .

Таким образом, ваш исходный код фактически эквивалентен

transmute(aggr1 = as.numeric(val1) + as.numeric(val2), aggr2 = as.numeric(val3) + as.numeric(val4))

без кавычек , и это различие имеет решающее значение для понимания того, что происходит.


Теперь, как это обобщить, чтобы вы могли на самом деле использовать разные имена столбцов (т.е. вычисленные значения)? Вкратце, вам нужно использовать !! перед именем столбца и := вместо =.

!! заставляет dplyr интерпретировать имена столбцов как вычисленные значения и использование := вместо = не позволяет R видеть значения как имена аргументов вызова функций (это работает в обход ограничений R, поскольку !! x = y будет синтаксически недопустимым).

Например:

prefix = 'aggr'
data_aggr = df %>%
  transmute(
    !! paste0(prefix, 1) := as.numeric(val1) + as.numeric(val2),
    !! paste0(prefix, 2) := as.numeric(val3) + as.numeric(val4)
  )

Как именно вычисляются имена столбцов, очевидно, зависит от вашей конкретной c проблемы.

Детали того, как динамически вызывать функции dplyr, объясняются в виньетке программирование с dplyr .

...