用值替换符号并简化R中的方程

cs7cruho  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(122)

我想替换方程中的符号,并简化R中的方程。
数据:

num_names <- c("num_a","num_aa","num_aaa","num_b")
num_values <- c(1,2,3,4)

df <- data.frame(id=c(1:3),
                 equation=c("2*x_a*num_a","num_a*(num_aa+1)^2","num_aaa+num_b*x_b"),
                 stringsAsFactors = F)

df

  id           equation
1  1        2*x_a*num_a
2  2 num_a*(num_aa+1)^2
3  3  num_aaa+num_b*x_b

预期产出:

id equation
1  1    2*x_a
2  2        9
3  3  3+4*x_b
fzsnzjdm

fzsnzjdm1#

试试这个:

df$eqn2 <- Reduce(function(prev, this) gsub(paste0("\\b", num_names[this], "\\b"), num_values[this], prev),
                  seq_along(num_names), init = df$equation)
df$eqn2 <- sapply(df$eqn2, function(eq) if (grepl("[A-Za-z_]", eq)) eq else eval(parse(text = eq)))
df$eqn2 <- gsub("(\\b1\\*|\\*1\\b)", "", df$eqn2)
df
#   id           equation    eqn2
# 1  1        2*x_a*num_a   2*x_a
# 2  2 num_a*(num_aa+1)^2       9
# 3  3  num_aaa+num_b*x_b 3+4*x_b

不是最优雅的,但它在这里工作得很好。
完美地用符号方式执行此操作的一个问题是,有些对象存在(由num_*变量引用,而不是真正的符号查找的首选格式),有些则不存在。我不知道有什么方法可以只计算部分方程而不遇到"未找到"错误。

eqqqjvef

eqqqjvef2#

我们使用polynom包将字符串转换为多项式类对象,然后转换为字符串。e是转换为R表达式的方程,L是变量值的列表,变量名为变量名。我们还包括polynomial(),变量名保存在xname中(这是edummy中唯一未定义的变量,如果没有)转换为L。然后根据L计算e,并将其转换为字符。polynomial总是得到名称x,所以在最后我们用xname替换x

library(polynom)

transform(df, equation = sapply(equation, function(ch) {
   e <- str2lang(ch)
   L <- c(list(polynomial()), as.list(num_values))
   xname <- setdiff(all.vars(e), num_names)
   if (length(xname) == 0) xname <- "dummy"
   names(L) <- c(xname, num_names)
   gsub("x", xname, as.character(eval(e, L)))
}))

给予

id  equation
1  1     2*x_a
2  2         9
3  3 3 + 4*x_b

相关问题