You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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批量处理(无需额外包)

适合不想安装额外依赖的场景,代码简洁高效:

  1. 批量读取文件
    先整理文件路径向量,用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")
    
  2. 提取需保留的No值
    从df1中取出要保留的A、B、C标识:

    keep_nos <- df_list$df1$No[df_list$df1$No %in% c("A", "B", "C")]
    
  3. 过滤其他数据框的重复行
    对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, ]
    
  4. 合并并输出结果
    合并所有处理后的数据框,写入目标文件:

    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 11:50:00