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

如何将DataFrame列表传入自定义R函数 解决do.call调用报错问题

问题核心原因

  • 自定义函数内列名大小写不匹配:你定义的tibble列名是小写的new_aur,但lm公式里写的是大写开头的new_AUR,运行时会找不到对应列
  • do.call使用逻辑错误:do.call的作用是把列表的每个元素作为独立参数传入目标函数,你的函数仅接收1个x参数,传入包含2个元素的test2列表就会多出未使用的参数,触发报错

正确实现方案

首先先修正自定义函数的列名和冗余问题:

library(caret) # 提前加载caret包,否则createDataPartition、trainControl会报错
model_fitting_decay <- function(x) {
  set.seed(4123)
  x <- data.frame(x)
  trainIndex <- createDataPartition(x$qty, p = .8, 
                                    list = FALSE, 
                                    times = 1)
  df_data_train <- x[trainIndex,]
  # 注:原代码定义的trcontrol未被后续逻辑使用,不需要可直接删除
  trcontrol <- trainControl(method = "repeatedcv",
                            number = 10,
                            repeats = 3)
  # 将列名修正为和数据一致的小写new_aur
  model_train_decay <- lm(log(qty)~new_aur, data=df_data_train)
  return(model_train_decay)
}

场景1:给test2中每个tibble分别拟合模型

用lapply遍历列表即可,不需要do.call:

model_list <- lapply(test2, model_fitting_decay)

运行后model_list$a、model_list$b就是对应两个数据集的拟合结果。

场景2:把test2的两个tibble合并为一个数据集拟合单个模型

如果确实需要用到do.call,可以先把两个tibble按行合并再传入函数:

# 合并列表内所有tibble
combined_df <- do.call(rbind, test2)
# 传入拟合函数
total_model <- model_fitting_decay(combined_df)

内容的提问来源于stack exchange,提问作者jolii

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:24:05