在R语言中高效读取多文件并去重合并的实现方法
问题描述
我文件夹里有file1.txt、file2.txt、file3.txt多份文件,目前用以下代码逐个读取:
df1 <- read.delim("/home/D/file1.txt", header = FALSE, sep = " ", quote = "") df2 <- read.delim("/home/D/file2.txt", header = FALSE, sep = " ", quote = "") df3 <- read.delim("/home/D/file3.txt", header = FALSE, sep = " ", quote = "")
读取后的df1、df2、df3中,都存在No为A、B、C的重复行。我希望保留df1中的这些行,删除其他数据框里的对应重复行,最后把所有数据高效合并成一个文件,期望输出如下:
No Value 1 A 30 2 B 65 3 C 50 4 A01 72 5 A02 8 6 A03 13 7 A04 43 8 A05 6 9 A06 8 10 A07 47 11 A08 3 12 A09 78
实现方案
方法一:基础R批量处理(无需额外包)
适合不想安装额外依赖的场景,代码简洁高效:
批量读取文件
先整理文件路径向量,用lapply批量读取,同时统一列名避免后续混乱:# 定义所有目标文件的路径 file_paths <- c("/home/D/file1.txt", "/home/D/file2.txt", "/home/D/file3.txt") # 批量读取并指定列名 df_list <- lapply(file_paths, function(path) { read.delim(path, header = FALSE, sep = " ", quote = "", col.names = c("No", "Value")) }) # 给列表中的数据框命名,方便区分 names(df_list) <- c("df1", "df2", "df3")提取需保留的No值
从df1中取出要保留的A、B、C标识:keep_nos <- df_list$df1$No[df_list$df1$No %in% c("A", "B", "C")]过滤其他数据框的重复行
对df2、df3移除No在保留列表中的行:df_list$df2 <- df_list$df2[!df_list$df2$No %in% keep_nos, ] df_list$df3 <- df_list$df3[!df_list$df3$No %in% keep_nos, ]合并并输出结果
合并所有处理后的数据框,写入目标文件:final_df <- do.call(rbind, df_list) # 写入结果,可根据需求修改路径和参数 write.table(final_df, "/home/D/output.txt", sep = " ", row.names = TRUE, col.names = TRUE)
方法二:tidyverse工具链(简洁易读)
如果日常使用tidyverse系列包,这种写法更直观:
library(tidyverse) # 批量读取文件并整理成命名列表 file_paths <- c("/home/D/file1.txt", "/home/D/file2.txt", "/home/D/file3.txt") df_list <- tibble(file = file_paths) %>% mutate( data = map(file, ~read_delim(.x, delim = " ", col_names = c("No", "Value"), quote = "", col_types = cols())), name = str_extract(file, "file\\d+") ) %>% select(name, data) %>% deframe() # 提取df1中需保留的No值 keep_nos <- df_list$df1 %>% filter(No %in% c("A", "B", "C")) %>% pull(No) # 合并处理后的数据 final_df <- bind_rows( df_list$df1, df_list$df2 %>% filter(!No %in% keep_nos), df_list$df3 %>% filter(!No %in% keep_nos) ) # 输出结果文件 write_delim(final_df, "/home/D/output.txt", delim = " ")
关键注意点
- 确保所有输入文件的列结构完全一致,都是两列(No和Value),读取时指定
col.names能避免列名混乱。 - 如果后续需要处理更多文件,只需在
file_paths向量中添加新路径即可,批量处理的方式扩展性更强。
内容的提问来源于stack exchange,提问作者Roq
相关产品推荐
相关产品推荐

