You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用dplyr mutate调用data.table中存储的函数报错求助

问题解决方法

错误原因

  1. 函数名不匹配:你数据里的spec_fun列写的"weibull"是密度函数dweibull,但要生成随机数应该用"rweibull",直接用weibull会找不到对应生成随机数的函数。
  2. 批量处理 vs 逐行处理:mutate默认按列批量操作,spec_fun是整个字符向量,而do.call的what参数只能接受单个函数或字符串,无法处理向量,必须逐行调用每个行对应的函数。
  3. 参数传递错误:原代码里的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 08:19:54