解决在数据框列中存储为文本的方程式(使用其他列作为输入)

时间:2019-02-19 16:03:32

标签: r dataframe equation

我在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问题:该问题询问如何使用同一数据框中的其他列来填充方程列中的变量。

1 个答案:

答案 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行,dh可以在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)