我有幾個名稱為 RTDFE、TRYFG、FTYGS、WERTS 的檔案……比如 100 個txt格式的檔案。對于每個檔案,我使用以下代碼并將輸出寫入檔案。
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 ...
這該怎么做?任何幫助。
uj5u.com熱心網友回復:
將你所有的名字放在一個名為 的向量中怎么樣names,如下所示:
names<-c("TRYFG","RTDFE",...)
然后將每個檔案提供給讀取檔案、合并檔案并回傳行的函式
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))
}
f然后只需對中的每個值呼叫呼叫此函式names,將結果系結在一起
do.call(rbind, lapply(names, f))
創建向量的簡單方法names如下:
p = "_(filter|data).txt"
names = unique(gsub(p,"",list.files(pattern = p)))
uj5u.com熱心網友回復:
我在這里做一些假設。第一個假設是您將所有這些檔案放在一個檔案夾中,而該檔案夾中沒有其他文本檔案 (.txt)。如果是這樣,您可以使用命令 list.files 獲取檔案串列。但是這樣做時,您將獲得“_data.txt”和“filter.txt”。我們需要一種方法來提取名稱的基本部分。我使用“str_replace”從串列中洗掉“_data.txt”和“_filter.txt”。但是這樣做時,您將獲得一個包含兩個條目的串列。因此我使用“唯一”命令。我將其存盤在“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"))))
}
uj5u.com熱心網友回復:
好的,我假設您有一個名為“data”的檔案夾,其中包含名為“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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/473783.html
