我在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中的值从它们各自的行中求解方程。那可能吗?
这不同于其他仅询问如何评估以文本形式存储的公式的SO问题:该问题询问如何使用同一数据框中的其他列来填充方程列中的变量。
答案 0 :(得分:0)
如果我正确理解了您的问题,则以下内容(在每一行上循环)应该适用于您提供的示例数据框:
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 $ equation中。
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。
刚刚意识到:在我的版本中,我使用 stringsAsFactors = FALSE
选项创建了df,以确保df $ equation是df中的字符类,而不是因素。>
如果您的实际数据将df $ equation作为一个因数,那么(除非您有理由希望它成为一个因数)对于本练习,我建议您a)将选项用于stringsAsFactors = FALSE
或b)在代码的开头将其转换为字符,例如使用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)