R中如何将数据框内存储的公式字符串转换为对应数值
问题原因
你直接在mutate中调用eval(parse(text = formula))时,parse()会将整个formula列的所有字符串解析为多个表达式,而eval()默认仅返回最后一个表达式的执行结果,因此会出现所有行的eval值都相同的错误结果。
解决方案1:按行计算(最便捷)
搭配dplyr的rowwise()按行分组,让每行单独执行表达式解析和计算即可:
library(dplyr) mydata <- data.frame( formula = c("5.89*10^3", "1.28*10^2", "4.11*10^5") ) mydata <- mydata %>% rowwise() %>% # 按行分组,每行单独执行后续计算 mutate(eval = eval(parse(text = formula))) %>% ungroup() # 计算完成后取消行分组,避免影响后续操作
运行后eval列的值就是你需要的5890、128、411000。
解决方案2:基础R实现
用sapply逐行遍历处理formula列:
mydata$eval <- sapply(mydata$formula, function(x) eval(parse(text = x)))
更安全的实现(规避eval风险)
如果你的所有表达式都是系数*10^指数的固定格式,可以拆分字符串直接计算,不需要执行表达式解析,避免恶意代码执行风险:
library(dplyr) library(tidyr) mydata <- mydata %>% separate(formula, into = c("coef", "exp"), sep = "\\*10\\^", convert = TRUE) %>% mutate(eval = coef * 10^exp)
内容的提问来源于stack exchange,提问作者MDStat
相关产品推荐
相关产品推荐

