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

使用map_dfr传入多个DataFrame计算中位数时报错,求代码修正

问题分析

你遇到的错误根源是c(iris1, iris2)的用法错误:用c()组合两个数据框时,会把它们拆成由各列组成的扁平列表,而非保留数据框的集合结构。当map_dfr把这个列表的单个元素传给iris_median的df参数时,df变成了单个列(列表元素),summarise自然无法处理非数据框对象。

修正方案

场景1:遍历多个数据框,计算同一列的中位数

把数据框放在列表中(用list()而非c()),调整map_dfr的参数传递逻辑,让它遍历数据框列表,同时固定列名参数:

library(tidyverse)

iris_median <- function(df, col) {
    df %>%
        summarise(Median = median(.data[[col]], na.rm = TRUE)) %>%
        mutate(field = as.character(col))
}

# 用list()保存多个数据框,同时命名方便区分数据集
df_list <- list(setosa = iris[1:50,], versicolor = iris[51:100,])

# 遍历数据框列表,传递固定列名,用.id自动生成数据集标识列
median_df <- map_dfr(
    df_list,
    .f = iris_median,
    col = "Sepal.Length",
    .id = "dataset"
)

场景2:同时遍历多个数据框和多个列

如果需要同时处理多数据框+多列的组合,可用cross_df生成参数组合,再用pmap_dfr遍历:

# 生成所有参数组合:数据框+列名
param_grid <- cross_df(
    list(
        df = list(setosa = iris[1:50,], versicolor = iris[51:100,]),
        col = c("Sepal.Length", "Sepal.Width")
    )
) %>%
    mutate(dataset = names(df))

# 遍历参数组合计算中位数
median_df <- pmap_dfr(
    param_grid,
    ~ iris_median(..1, ..2) %>% mutate(dataset = ..3)
)
关键注意点
  • 组合多个数据框必须用list(),c()会破坏数据框的结构,将其拆分为列的集合。
  • map_dfr的.id参数可以自动从列表名称生成数据集标识列,无需手动传递名称。
  • 多参数组合遍历场景下,pmap_dfr配合参数网格的写法逻辑更清晰,扩展性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 02:12:43