Решите уравнения, хранящиеся в виде текста в столбце данных (используя другие столбцы в качестве входных данных) - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть кадр данных в R с рядом уравнений в виде столбца и переменных, которые будут использоваться в уравнении в дополнительных столбцах:

df <- data.frame( equation = c('2+d','2+4+d*h','(5*d^h)/100'), 
                  d = c(1,2,3), 
                  h = c(1,3,4))

Я хочу использовать значения из d и hчтобы решить уравнение из соответствующих строк.Это возможно?

NB. Это отличается от других вопросов SO, которые задают просто, как оценить формулу, хранящуюся в виде текста: Этот вопрос спрашивает, как использовать другие столбцы в пределах одного и того же кадра данных для заполнения переменных в столбце уравнения.

1 Ответ

0 голосов
/ 05 апреля 2019

Если я правильно понимаю ваш вопрос, следующий (цикл над каждой строкой) должен работать для предоставленного вами образца данных:

df$equation <- as.character(df$equation)   # N.B. only needed if df$equation is a factor (as it is in your original sample data)

df$result <- as.numeric(NA)   # create an empty numeric column to store results

for(i in 1:nrow(df)){
  df$result[i] <- with(df[i,], eval(parse(text=equation))) 
}

df
     equation d h result
1         2+d 1 1   3.00
2     2+4+d*h 2 2  10.00
3 (5*d^h)/100 3 4   4.05

Выше parse() используется для возврата проанализированных, но не оцененных выражений, которыехранится как текст в уравнении df $.

eval() может вычислить выражение.

Использование with() вокруг всего (для создания локальной среды, построенной из данных) позволяет нам обращаться к именам столбцов без префикса df $.

Другими словами, вся строка данных кадра df[i,] (все имена столбцов данных в качестве переменных сами по себе) доступны как переменные для вызова eval(parse()).Так, например, для строки 2, d и h могут быть оценены в пределах eval(parse(text='2+4+d*h')) как 2 + 4 + 2 * 2 = 2 + 4 + 4 = 10.

Редактировать

Только что понял: в моей версии ваших образцов данных я создал df, используя опцию для stringsAsFactors = FALSE, чтобы убедиться, что уравнение df $ является классом символов в вашем df, а не фактором.

Если ваши фактические данные имеют в качестве коэффициента уравнение df $, то (если у вас нет причин, по которым вы хотите, чтобы оно было фактором), для этого упражнения я предлагаю вам либо: а) использовать опцию для stringsAsFactors = FALSE, либо б) преобразовать его в символ всамое начало вашего кода, например, с использованием df$equation <- as.character(df$equation)


Пример используемых данных:

df <- data.frame ( equation = c('2+d','2+4+d*h','(5*d^h)/100'), 
                   d = c(1,2,3), 
                   h = c(1,2,4), 
                   stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...