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