使用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
相关产品推荐
相关产品推荐

