шаблон, соответствующий формуле в R - PullRequest
1 голос
/ 30 октября 2019

Я хочу сделать сопоставление с образцом переменных в формуле. идеальное решение должно работать следующим образом: formula <- 'variable_1+variable_2*variable_3-variable_4/variable_5 + 456' и вывод должен быть variable_1 , variable_2 , variable_3 , variable_4 , variable_5 .

Примечание: имя переменной может содержать символ, подчеркивание (_), только цифры и операции ограничены +, -, *, /. Формула также может содержать константы (как здесь это 456). Вывод должен содержать только имена переменных и игнорировать любые числовые константы.

Я пробовал приведенные ниже коды. Я смог проверить только имя переменной, содержащей только символ , и операция минус (-) также не работает.

formula <- "variableX +variableY*VariableZ"

strapplyc(gsub(" ", "", format(formula), fixed = T), "-?|[a-zA-Z_]+", simplify = T, ignore.case = T) даетниже вывода

   [,1]       
[1,] "variableX"
[2,] ""         
[3,] "variableY"
[4,] ""         
[5,] "VariableZ" 

, что является правильным, НО, когда я включаю минус (-), strapplyc дает неправильные результаты formula <- "variableX -variableY" strapplyc(gsub(" ", "", format(formula), fixed = T), "-?|[a-zA-Z_]+", simplify = T, ignore.case = T) дает ниже вывода

   [,1]       
[1,] "variableX"
[2,] "-"         
[3,] "variableY"

IБуду признателен, если кто-нибудь может помочь мне в идеальном решении.

Ответы [ 2 ]

2 голосов
/ 30 октября 2019

Для этого можно использовать регулярные выражения:

formula <- "variable_1+variable_2*variable_3-variable_4/variable_5"
gsub("[\\+\\*\\-\\/]", ", ", formula)

Объяснение регулярного выражения:

  • [ и ] начинать и заканчивать группу символов, которую выхотите выбрать
  • \\+ экранирует знак +, при этом вы хотите заменить на ","
  • \\* экранирует знак *, а вы хотите заменить на ","
  • \\- экранирует знак -, с которым вы хотите заменить на ","
  • \\/ экранирует знак /, вы хотите заменить на ","

Изменить, чтобы отразить обновленный запрос OP

Другой способ - просто извлечь ваши переменные. Приведенное ниже работает, если вы держите формат lowercaseletters_number для имени переменной:

formula <- "variable_1+variable_2*variable_3-variable_4/variable_5+34+brigadeiro_5"
paste(regmatches(formula, gregexpr("variable_[0-9]", formula))[[1]],
      collapse = ", ")

Вы также можете использовать пакет stringr, если вы хотите, чтобы код выглядел немного чище:

library(stringr)
str_extract_all(formula, "[a-z]*_[0-9]*")
1 голос
/ 30 октября 2019

Вы можете использовать strsplit() с некоторыми дополнениями.

res <- trimws(el(strsplit(formula, "\\+|\\-|\\*|\\/")))

После этого мы хотим, чтобы эти элементы давали NA, когда мы пытаемся привести их as.numeric().

res[is.na(suppressWarnings(as.numeric(res)))]
# [1] "variable_1" "variable_2" "variable_3" "variable_4" "variable_5"

Данные

formula <- 'variable_1+variable_2*variable_3-variable_4/variable_5 + 456'
...