Создание формулы с использованием очень длинных строк в R

Я нахожусь в ситуации, когда у меня есть вектор, полный имен столбцов для действительно большого фрейма данных.

Предположим: x = c("Name", "address", "Gender", ......, "class" ) [примерно 100 переменных]

Теперь я хотел бы создать формулу, которую я в конечном итоге буду использовать для создания HoeffdingTree. Я создаю формулу, используя:

myformula <- as.formula(paste("class ~ ", paste(x, collapse= "+")))

Это вызывает следующую ошибку:

Ошибка в синтаксическом анализе (текст = x): :1:360: неожиданное 'еще' 1:e+распространение+молиться+просто+хочу+усилить+аргументировать+blxckникотин+настроение+сейчас+право+на самом деле+герапатра+должно+просто+ сосать+там+всегда+печенье+всегда+все+получать+приятно+ниггер+они+раз+абу+все+alliepicl

Часть paste в приведенном выше выражении работает нормально, но передача ее в качестве аргумента as.formula вызывает всевозможные странные проблемы.


person Jayaprakash Mara    schedule 10.04.2015    source источник
comment
У вас есть столбец с именем else? Кажется, выдается ошибка: as.formula(paste("class ~ ", paste(c("or","else"), collapse= "+"))) Ошибка при анализе (текст = x, keep.source = FALSE) : ‹текст›:1:13: неожиданное 'else' 1: класс ~ or+else   -  person    schedule 10.04.2015


Ответы (3)


Проблема в том, что у вас есть ключевые слова R в качестве имен столбцов. else — это ключевое слово, поэтому его нельзя использовать как обычное имя.

Упрощенный пример:

s <- c("x", "else", "z")
f <- paste("y~", paste(s, collapse="+"))
formula(f)
# Error in parse(text = x) : <text>:1:10: unexpected '+'
# 1: y~ x+else+
#              ^

Решение состоит в том, чтобы заключить ваши слова в обратные кавычки "`", чтобы R воспринимал их как несинтаксические имена переменных.

f <- paste("y~", paste(sprintf("`%s`", s), collapse="+"))
formula(f)
# y ~ x + `else` + z
person Hong Ooi    schedule 10.04.2015

Вы можете сначала уменьшить свой набор данных

dat_small <- dat[,c("class",x)]

а затем использовать

myformula <- as.formula("class ~ .")

. означает использование всех остальных (всех, кроме класса) столбцов.

person Rentrop    schedule 10.04.2015

Вы можете попробовать reformulate

 reformulate(setdiff(x, 'class'), response='class')
 #class ~ Name + address + Gender

где «х»

  x <- c("Name", "address", "Gender", 'class')

Если ключевые слова R находятся в «x», вы можете сделать

   reformulate('.', response='class')
   #class ~ .
person akrun    schedule 10.04.2015