使用purrr::map_df绑定同结构数据框列表报错的问题排查
解决
purrr::map_df()报错的问题 这个报错其实很好解决,问题出在你对purrr::map_df()的用法理解上~你遇到的Error in as_mapper(.f, ...) : argument ".f" is missing, with no default错误,核心原因是**map_df()必须要指定第二个参数.f——也就是要应用在列表每个元素上的函数**,你只传了列表my_list,没给对应的操作函数,所以R才会提示缺少参数。
接下来分两种情况给你针对性的解决方案:
情况1:只想直接绑定所有数据框(你的需求看起来更贴近这个)
如果你的目标只是把列表里所有列数一致的数据框行绑定在一起,那根本不需要用map_df(),直接用更简单的专用绑定函数就行:
方案A:用dplyr::bind_rows()
这是日常绑定数据框列表最常用的方法:
library(dplyr) combined_df <- bind_rows(my_list)
如果需要保留每个数据框的原始名称作为来源标识,可以加.id参数:
combined_df <- bind_rows(my_list, .id = "original_df_name")
方案B:用purrr::list_rbind()
这是purrr包专门为绑定列表数据框设计的函数,用法更直观:
library(purrr) combined_df <- list_rbind(my_list) # 同样支持.id参数保留来源名称 combined_df <- list_rbind(my_list, .id = "original_df_name")
情况2:需要先对每个数据框做操作再绑定
如果你确实需要先对列表里的每个数据框执行某个操作(比如筛选行、新增列),再把结果绑定成数据框,那必须给map_df()传入.f参数。比如给每个数据框新增一列标记它来自哪个原始数据框:
library(purrr) library(dplyr) # 用imap_df更方便,它能同时拿到当前迭代的data frame和它在列表里的名称 combined_df <- imap_df(my_list, ~ { # .x代表当前的data frame,.y代表它的列表名称 mutate(.x, source_df = .y) })
简单总结下:map_df()是「给列表元素映射函数 + 绑定结果」的组合工具,不是单纯的绑定工具。如果只是想把数据框拼在一起,用bind_rows()或list_rbind()更直接高效~
内容的提问来源于stack exchange,提问作者Nazer
相关产品推荐
相关产品推荐

