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

如何在R中合并含Gene、Length、Counts的多CSV文件并去除NA值

解决多CSV文件合并时除首样本外其余列NA的问题

你的问题出在直接用map_df按行拼接数据,但每个CSV里的GeneID和Length其实是同一批基因的信息,只有Counts对应不同样本。直接行拼接会让后续样本的Counts因列名重复无法匹配到对应基因行,导致大量NA。

下面是正确的合并思路:先给每个样本的Counts列命名为对应的样本名,再按GeneID和Length合并所有数据框,把所有样本的计数整合到同一个表中。

方法一:用tidyverse实现

library(tidyverse)

# 设置工作目录(替换成你的实际路径)
setwd("~/Desktop/cardio_metabolism_annotated_counts/asdf RNA seq/raw_data")

# 获取所有CSV文件,提取样本名(从文件名去掉.csv后缀)
file_list <- list.files(pattern = "*.csv")
sample_names <- str_remove(file_list, "\\.csv$")

# 定义读取函数:读取文件并将Counts列重命名为样本名
read_sample_data <- function(file_path, sample_name) {
  read_csv(file_path) %>%
    rename(!!sample_name := Counts)  # 动态重命名Counts列
}

# 批量读取+合并所有文件
combined_df <- map2(file_list, sample_names, read_sample_data) %>%
  reduce(full_join, by = c("GeneID", "Length"))

# 查看合并结果
head(combined_df)

方法二:用data.table实现

如果习惯用data.table,也可以用下面的代码:

library(data.table)

setwd("~/Desktop/cardio_metabolism_annotated_counts/asdf RNA seq/raw_data")

file_list <- list.files(pattern = "*.csv")
sample_names <- sub("\\.csv$", "", file_list)

# 读取第一个文件作为基础表,并重命名Counts列
combined_df <- fread(file_list[1]) %>%
  setnames("Counts", sample_names[1])

# 循环读取剩余文件并合并
for (i in 2:length(file_list)) {
  temp_df <- fread(file_list[i]) %>%
    setnames("Counts", sample_names[i])
  combined_df <- merge(combined_df, temp_df, by = c("GeneID", "Length"), all = TRUE)
}

head(combined_df)

注意事项

  • 确保所有CSV文件中的GeneID和Length格式完全一致(比如无大小写差异、无多余空格),否则合并时会因匹配失败出现NA
  • 如果文件名包含多余前缀/后缀,可调整str_remove或sub的规则来提取正确的样本名,比如文件名是sample_R210808.csv,可改用str_remove(file_list, "sample_|\\.csv$")
  • 若只想保留所有样本都存在的基因,可将full_join换成inner_join,或把merge中的all = TRUE改成all = FALSE

内容的提问来源于stack exchange,提问作者Sara González

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 15:13:17