如何在R的for循环中过滤多个数据框?解决filter方法报错问题
解决R语言list对象使用filter报错的问题
问题场景
处理无家可归者时点估计的Excel工作簿「2007-2022 Point-in-Time Estimates by CoC」,通过rio::import_list()得到包含8个数据框的列表florida(对应2015-2022年工作表),批量过滤指定县数据时出现报错:
Error in UseMethod("filter") : no applicable method for 'filter' applied to an object of class "list"
报错原因
原循环代码存在三个问题:
- 未定义
df对象,错误尝试用df[[i]]访问列表元素 - 管道符拼写错误(
%>应改为%>%) - 未将过滤结果赋值回列表,且部分数据框未统一列名(需将"CoC Name"重命名为"cocname"才能通用过滤条件)
解决方案
方案1:修正for循环
直接操作列表对象,无需将列表转至全局环境:
# 给列表元素命名(可选,方便后续识别年份) names(florida) <- paste0('df', 2015:2022) # 循环处理每个数据框:重命名列 + 过滤指定县 for (i in seq_along(florida)) { florida[[i]] <- florida[[i]] %>% rename(cocname = "CoC Name") %>% filter(cocname == "Gainesville/Alachua, Putnam Counties CoC") }
方案2:用purrr批量处理(更简洁的tidyverse风格)
利用purrr::map()直接对列表中的每个数据框执行批量操作:
# 批量重命名列并过滤 florida_filtered <- florida %>% map(~ .x %>% rename(cocname = "CoC Name") %>% filter(cocname == "Gainesville/Alachua, Putnam Counties CoC")) # 给过滤后的列表添加年份命名 names(florida_filtered) <- paste0('df', 2015:2022)
后续:合并多年份数据为行结构
通过dplyr::bind_rows()将各年份数据合并,并添加年份列:
library(stringr) combined_data <- bind_rows(florida_filtered, .id = "year") %>% # 从id中提取数字年份 mutate(year = str_extract(year, "\\d+") %>% as.integer()) %>% # 保留需要的特定列,替换为实际列名 select(year, cocname, 列名1, 列名2, 列名3)
内容的提问来源于stack exchange,提问作者user12137078
相关产品推荐
相关产品推荐

