如何遍历不同的文件并在 R 中使用文件名保存输出?

How to loop over on different files and save the output with filename in R?

我有几个名称为 RTDFE、TRYFG、FTYGS、WERTS 的文件...比如 txt 格式的 100 个文件。对于每个文件,我使用以下代码并将输出写入文件。

name = c("RTDFE")

file1 <- paste0(name, "_filter",".txt")
file2 <- paste0(name, "_data",".txt")
  
### One
  
A <- read.delim(file1, sep = "\t", header = FALSE)

#### two
  
B <- read.delim(file2, sep = "\t", header = FALSE)

C <- merge(A, B, by="XYZ")
nrow(C)
145

输出:

Samples    Common
 RTDFE      145  

每次我将文件分配给变量 name 运行 我的代码并将输出写入文件。相反,我希望代码一次性成为所有文件的 运行,并希望得到以下输出。 Common 是合并数据框的行 C

我需要的输出:

Samples    Common
 RTDFE      145
 TRYFG      ...
 FTYGS      ...
 WERTS      ...

如何做到这一点?任何帮助。

我在这里做一些假设。 第一个假设是您将所有这些文件都放在一个文件夹中,该文件夹中没有其他文本文件 (.txt)。 如果是这样,您可以使用命令 list.files 获取文件列表。 但是这样做时你会得到“_data.txt”和“filter.txt”。 我们需要一种方法来提取名称的基本部分。 我使用“str_replace”从列表中删除“_data.txt”和“_filter.txt”。 但是这样做时你会得到一个包含两个条目的列表。因此我使用“unique”命令。 我将其存储在“lfiles”中,该文件现在将包含“RTDFE、TRYFG、FTYGS、WERTS...”以及满足条件的任何其他文件。 在此之后,我 运行 在此列表上进行 for 循环。 我像您一样重新打开文件。 我按 XYZ 合并,然后立即将结果放入数据框中。 通过使用 rbind,我不断将结果添加到数据框“res”。

library(stringr)

lfiles=list.files(path = ".", pattern = ".txt")

## we strip, from the files, the "_filter and the data
lfiles=unique( sapply(lfiles, function(x){
  x=str_replace(x, "_data.txt", "")
  x=str_replace(x, "_filter.txt", "") 
  return(x)
} ))
  

res=NULL
for(i in lfiles){
  
  file1 <- paste0(i, "_filter.txt")
  file2 <- paste0(i, "_data.txt")
  
  ### One
  
  A <- read.delim(file1, sep = "\t", header = FALSE)
  
  #### two
  
  B <- read.delim(file2, sep = "\t", header = FALSE)
  
  res=rbind(data.frame(Samples=i, Common=nrow(merge(A, B, by="XYZ"))))
  
}

如何将您所有的名字放在一个名为 names 的向量中,如下所示:

names<-c("TRYFG","RTDFE",...)

然后将每个文件提供给一个读取文件、合并文件和 returns 行的函数

f<-function(n) {
    fs = paste0(n,c("_filter", "_data"),".txt")
    C = merge(
        read.delim(fs[1],sep="\t", header=F),
        read.delim(fs[2],sep="\t", header=F), by="XYZ")
    data.frame(Samples=n,Common=nrow(C))
}

然后只需对 names 中的每个值调用此函数 f,行将结果绑定在一起

do.call(rbind, lapply(names, f))

创建向量 names 的简单方法如下:

p = "_(filter|data).txt"
names = unique(gsub(p,"",list.files(pattern = p)))

好的,我假设您有一个名为“数据”的文件夹,其中包含名为“RTDFE_filter.txt、RTDFE_data、TRYFG_filter.txt、TRYFG_data.txt 等的文件(仅正是这个文件)。

这段代码应该给出了一种可能的方式

# save the file names
files = list.files("data") 

# get indexes for "data" (for "filter" indexes, add 1)
files_data_index = seq(1, length(f), 2) # 1, 3, 5, ...

# loop on indexes
results = lapply(files_data_index, function(i) {
    A <- read.delim(files[i+1], sep = "\t", header = FALSE)
    B <- read.delim(files[i],   sep = "\t", header = FALSE)
    C <- merge(A, B, by="XYZ")

    samp = strsplit(files[i], "_")[[1]][1]
    com  = nrow(C)

    return(c(Samples = samp, Comon = com))
})

# combine results
do.call(rbind, results)