如何将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
相关产品推荐
相关产品推荐

