在R中使用eval()计算行内公式得到意外结果的解决办法
问题原因
你当前的代码中,eval(parse(text = equation))并非逐行计算:parse(text = equation)会把所有公式解析成一个表达式集合,eval执行时会将整个t列的向量(c(1,2,3))代入所有表达式,最终仅返回最后一个表达式的计算结果(t^3的结果1,8,27),因此前两行结果不符合预期。
修复方案
有两种常用的修复方式:
方式一:使用rowwise()逐行处理
通过rowwise()让dplyr按行执行计算,此时每行的t是单个值,代入对应公式即可得到正确结果:
library(magrittr);library(dplyr) dt <- data.frame(t = c(1,2,3), equation = c("t+1", "5*t", "t^3")) dt %<>% rowwise() %>% mutate(y = eval(parse(text = equation))) %>% ungroup()
运行后结果:
t equation y 1 1 t+1 2 2 2 5*t 10 3 3 t^3 27
方式二:使用purrr::map2()逐元素匹配计算
利用map2()将t列的每个值与对应行的公式配对,在计算时将单个t值传入表达式的执行环境:
library(magrittr);library(dplyr);library(purrr) dt <- data.frame(t = c(1,2,3), equation = c("t+1", "5*t", "t^3")) dt %<>% mutate(y = map2_dbl(t, equation, ~eval(parse(text = .y), list(t = .x))))
此方式同样能得到符合预期的结果,且在数据量较大时,效率通常优于rowwise()。
内容的提问来源于stack exchange,提问作者T X
相关产品推荐
相关产品推荐

