【问题标题】:Solve equations stored as text in a dataframe column (using the other columns as inputs)求解以文本形式存储在数据框列中的方程(使用其他列作为输入)
【发布时间】:2019-07-13 04:51:13
【问题描述】:

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

【问题讨论】:

    标签: r dataframe equation


    【解决方案1】:

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

    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$equation 是您的 df 中的字符类,而不是一个因素。

    如果您的实际数据将 df$equation 作为一个因素,那么(除非您有理由希望它成为一个因素)对于这个练习,我建议您 a) 使用 stringsAsFactors = FALSE 的选项或 b) 转换它在代码的最开头添加字符,例如使用df$equation &lt;- 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)
    

    【讨论】:

      猜你喜欢
      • 2021-10-26
      • 1970-01-01
      • 2015-04-06
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      • 2017-02-03
      相关资源
      最近更新 更多