R语言对列表内多数据框调用mutate()以其名称为参数新增列的方法
报错核心原因
dplyr::mutate() 是专门为数据框/tibble设计的操作方法,你直接对列表对象调用mutate才会触发方法不匹配的报错。你需要遍历列表中每个数据框元素,同时传入对应名称完成新增列操作,以下是几种无显式循环的实现方案:
实现方案
- 方案1:tidyverse生态下用
purrr::imap(最简洁,推荐)imap专门设计用于处理命名列表,会自动把列表元素作为第一个参数,对应元素名作为第二个参数传入函数:
library(purrr) library(dplyr) dfs <- imap(dfs, ~ mutate(.x, goal = .y))
这里.x代指遍历到的单个数据框,.y代指该数据框在列表中对应的名称。
- 方案2:纯base R实现,不需要加载额外包
用Map()函数同时遍历数据框列表和名称向量即可:
dfs <- Map(function(df, name) { transform(df, goal = name) }, dfs, names(dfs))
- 方案3:如果后续需要把所有数据框合并为一个总表,可以直接用
dplyr::bind_rows的.id参数一步完成
library(dplyr) total_df <- bind_rows(dfs, .id = "goal")
.id参数会自动把每个列表元素的名称作为新增列的值,列名就是你传入的字符串goal。
内容的提问来源于stack exchange,提问作者Matteo
相关产品推荐
相关产品推荐

