使用dplyr mutate调用data.table中存储的函数报错求助
问题解决方法
错误原因
- 函数名不匹配:你数据里的
spec_fun列写的"weibull"是密度函数dweibull,但要生成随机数应该用"rweibull",直接用weibull会找不到对应生成随机数的函数。 - 批量处理 vs 逐行处理:
mutate默认按列批量操作,spec_fun是整个字符向量,而do.call的what参数只能接受单个函数或字符串,无法处理向量,必须逐行调用每个行对应的函数。 - 参数传递错误:原代码里的
lapply把整列的param_1、param_2传进去,而不是每行的单个参数值。
修正后的代码
首先修正数据里的函数名,然后用两种方式实现:
方式1:用rowwise()逐行处理
library(mixtools) library(dplyr) library(data.table) # 修正函数名:weibull改为rweibull(随机数生成函数) my_data <- data.table(spec_fun = c("rweibull", "rgamma", "rgamma"), param_1 = c(0.7767294, 0.7362431, 0.8118086), param_2 = c(6.8048834,0.1088231,0.1357522)) # 逐行生成样本并计算中位数 final <- my_data %>% rowwise() %>% mutate(my_med = { fun <- get(spec_fun) # 把字符串形式的函数名转为可调用的函数对象 samples <- fun(n = 1000, shape = param_1, scale = param_2) median(samples) }) %>% ungroup()
方式2:用purrr::pmap高效逐行处理
如果数据量较大,这种方式性能更好:
library(purrr) final <- my_data %>% mutate(my_med = pmap_dbl(., function(spec_fun, param_1, param_2) { fun <- get(spec_fun) median(fun(1000, shape = param_1, scale = param_2)) }))
说明
get(spec_fun)能把字符串形式的函数名转为可调用的函数对象。- 两种方式都是逐行处理每行的函数名和参数,生成1000个样本后计算中位数,解决了原代码中批量处理导致的错误。
内容的提问来源于stack exchange,提问作者GSandro_Strongs
相关产品推荐
相关产品推荐

