在R中合并35个相似数据框的简便方法咨询
合并多个相似数据框的简化方法
方法1:用tidyverse的reduce函数(最简洁)
先把所有目标数据框存入一个列表,再通过reduce函数依次执行全连接,替代嵌套的full_join:
# 匹配所有以cnty开头、后跟两位数字的数据框,存入列表 cnty_list <- mget(ls(pattern = "^cnty\\d{2}$")) # 依次对列表内数据框执行full_join counties_9022 <- purrr::reduce(cnty_list, dplyr::full_join)
如果需要指定固定连接键(避免自动匹配所有列导致的问题),可添加by参数:
counties_9022 <- purrr::reduce(cnty_list, dplyr::full_join, by = c("fips_code", "industry_code"))
方法2:Base R的for循环实现
若偏好基础R语法,可通过循环完成合并:
# 获取所有目标数据框的名称 cnty_names <- ls(pattern = "^cnty\\d{2}$") # 初始化结果为第一个数据框 counties_9022 <- get(cnty_names[1]) # 循环合并剩余数据框(merge的all=TRUE等价于full_join) for (name in cnty_names[-1]) { counties_9022 <- merge(counties_9022, get(name), all = TRUE) # 指定连接键的写法: # counties_9022 <- merge(counties_9022, get(name), all = TRUE, by = c("fips_code", "industry_code")) }
额外优化:批量读取文件(省略手动命名步骤)
既然数据源是统一格式的BLS县级文件,可直接批量读取文件夹内的目标文件,无需手动逐个命名cnty90、cnty91等变量:
library(tidyverse) # 获取目标文件夹内所有符合格式的文件路径 file_paths <- list.files(path = "你的文件存放路径", pattern = ".*county.*\\.csv$", full.names = TRUE) # 批量读取并一次性合并 counties_9022 <- file_paths %>% map(read_csv) %>% # 若为其他格式,替换为read.delim/read.table等 reduce(full_join, by = c("fips_code", "industry_code"))
内容的提问来源于stack exchange,提问作者user3755053
相关产品推荐
相关产品推荐

