如何对列表应用dplyr函数且保留列表属性?求解代码报错
问题解决方法
你的代码存在两个核心问题:
- 变量名错误:你定义的列表是
ori_list,但代码里误写为m_list - 未使用列表迭代函数:
mutate和select仅针对单个data.frame生效,无法直接作用于列表,需要用迭代工具遍历列表中的每个元素逐个处理
以下是修正后的代码(基于tidyverse生态的purrr::map实现):
library(tidyverse) d1 <- data.frame(cat_1 = c('a','b','c','c'), value = c(1,2,3,4), amount = c(7,6,5,4)) d2 <- data.frame(cat_1 = c('a','b','e','c'), value = c(1,1,3,4), amount = c(7,6,7,4)) d3 <- data.frame(cat_1 = c('a','e','c','c'), value = c(1,2,8,4), amount = c(7,2,5,4)) ori_list <- list(d1,d2,d3) # 遍历列表处理每个data.frame,保留列表结构 new_list <- ori_list %>% map(~ .x %>% mutate(value_amount = value + amount, value_new = scale(value)) %>% select(cat_1, value_amount)) # 查看处理后的列表 new_list
代码说明
map函数会自动遍历ori_list中的每个data.frame,将单个data.frame传入.x参数- 在lambda函数(
~开头的部分)中,对每个.x执行mutate计算新列、select筛选列的操作 - 处理完成后返回的仍然是列表结构,每个元素对应原列表中处理后的data.frame
如果你习惯用base R,也可以用lapply实现相同效果:
new_list <- lapply(ori_list, function(df) { df %>% mutate(value_amount = value + amount, value_new = scale(value)) %>% select(cat_1, value_amount) })
内容的提问来源于stack exchange,提问作者anderwyang
相关产品推荐
相关产品推荐

