如果我正确理解您的问题,以下内容(循环遍历每一行)应该适用于您提供的示例数据框:
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$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)