2015-09-25 1 views
-1

Я пытаюсь найти способ форматирования числовой функции путем разбиения переменных и добавления математического оператора между ними. Что-то вродеСоздайте формулу из имен столбцов фрейма данных

y <- data.frame(1:5, 2:6, 3:7,4:8) 
names(y) <- c('a', 'b', 'c', 'd') 

и превратить его в формулу, которая выглядит следующим образом:

~a+b+c+d 

Я попытался:

x <-c(y) 
z <- paste('a', 'b', 'c', 'd', sep='+') 
as.numeric(as.character(z)) 

Это не работает, и я уверен, что это из-за разделителя «character», который я использую. Как мне это сделать?

+0

В ответ на Ваши комментарии: Поставьте обратные одиночные кавычки, за которым следует тильда с кавычкой и открытым Paren, то ваше выражение, то близок скобка. Функция формулы будет вызываться, и вы получите правильный объект формулы. (Почему вы не сказали, что хотите формулу?) –

+0

Да, я сожалею об этом. Наверное, я не знал, что именно искал. Я решил проблему сейчас, и я ценю всю вашу помощь. Позвольте мне отредактировать мой пост, чтобы другие могли ссылаться на него. Я бы поставил полный ответ, но я думаю, что Ричард хотел бы получить кредит. Я попросил его отложить его решение как отличный ответ, поэтому я могу отметить это как решение. –

ответ

1
> paste(names(y), collapse='+') 
[1] "a+b+c+d" 

Параметр, который вы использовали, - sep. вы должны использовать параметр collapse. Надеюсь, это поможет.

+0

Я ищу выражение, а не символы. Вот почему я [безуспешно] пытался as.numeric() –

+0

Я думаю, что вы действительно ищете объект формулы, а не выражение R. Они оба являются объектами языка R, но не являются одним и тем же классом. –

0

Опираясь на обоих ответов здесь ...

... если вы хотите, выражение:

parse(text = paste(names(y), collapse='+')) -> expr 

... если вы хотите, оцененные результаты:

eval(expr, envir = y) 

. .. Если вы хотите узнать больше: Non-standard evaluation by Wickham

+0

Это отвечает на мой прямой вопрос, и я благодарю вас за это. Но я думаю, я должен быть более конкретным. Выводом является выражение (a + b + c + d), но возможно ли, чтобы он был просто + b + c + d? –

+0

Если вы буквально просто хотите + b + c + d, вы можете использовать цитату (a + b + c + d) – Chris

+0

Я ищу более «автоматическую» версию перехода на + b + c + d, который включает чтение таблицы в той или иной форме. Ваш ответ parse() действительно хорош, но не совсем то, что я ищу –

0

Вы были очень близки со своей второй попыткой, которая будет иметь успех, если вы добыл с «[[» вместо «[»

> with(y, a+b+c+d) 
[1] 10 14 18 22 26 
> y[[1]]+y[[2]]+y[[3]]+y[[4]] 
[1] 10 14 18 22 26 

Это не имеет ничего общего с «+» - разделитель, который векторизованную и является то, что вы хотели, но в первый случай связан с поиском правильной функции, позволяющей оценивать выражение a+b+c+d в соответствующей среде данных.

Для формулы объекта .... либо:

`~`(a+b+c+d) # .... or 
#~a + b + c + d 

    as.formula("~a+b+c+d") 
# ~a + b + c + d 
+0

У меня такое впечатление, что они пытаются вернуть вызов или выражение. –

+0

Крис на той же длине волны, что и я. Я просто хочу сырое выражение. Выход из метода Криса: выражение (a + b + c + d). Но возможно ли это просто: a + b + c + d? –

+0

@AndrewYueh - Это именно то, что дает первая строка в моем ответе (а также строка 'cl'). –

 Смежные вопросы

  • Нет связанных вопросов^_^