如何遍历不同的文件并在 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)
我有几个名称为 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)