如何将分组回归后的列表合并为含列表名(cyl列)的DataFrame?
解决方案:将分组回归结果合并为带分组标识的DataFrame
你已经按cyl字段拆分mtcars数据集并完成分组线性回归,通过broom::tidy()得到了以cyl值为名称的结果列表,以下几种方法可以帮你将这些列表合并为单个DataFrame,并把原列表名作为cyl列的值对应到每行数据:
方法1:使用dplyr的bind_rows(兼容现有结果列表)
如果你已经保存了回归结果列表,可以直接用bind_rows()的.id参数提取列表名作为新列:
library(dplyr) library(broom) # 你的原有代码生成结果列表 reg_results <- lapply(split(mtcars, mtcars$cyl), \(x) lm(mpg ~ disp, data = x)) |> lapply(\(x) tidy(x)) # 合并列表并添加cyl列,同时转成数值型 combined_df <- bind_rows(reg_results, .id = "cyl") |> mutate(cyl = as.numeric(cyl)) # 查看最终结果 combined_df
方法2:使用purrr的map_dfr(一步完成)
用map_dfr()可以直接在分组回归后完成合并,无需单独保存中间列表,代码更简洁:
library(purrr) library(broom) combined_df <- mtcars |> split(.$cyl) |> map_dfr(\(x) tidy(lm(mpg ~ disp, data = x)), .id = "cyl") |> mutate(cyl = as.numeric(cyl)) combined_df
方法3:基础R实现
如果不想加载tidyverse包,用基础R也能实现:
library(broom) # 生成回归结果列表 reg_results <- lapply(split(mtcars, mtcars$cyl), \(x) tidy(lm(mpg ~ disp, data = x))) # 给每个子数据框添加cyl列 reg_results <- Map(function(df, cyl_val) { df$cyl <- as.numeric(cyl_val) df }, reg_results, names(reg_results)) # 合并所有子数据框并重置行名 combined_df <- do.call(rbind, reg_results) rownames(combined_df) <- NULL combined_df
以上三种方法都能生成你期望的输出格式,其中tidyverse系列的方法更简洁易读,适合日常数据处理场景。
内容的提问来源于stack exchange,提问作者Ramakrishna S
相关产品推荐
相关产品推荐

