我有三个目录,每个目录包含大约2,000个文件 - 这些文件具有相同的格式,但它们来自3个不同的来源。对于每组3个文件,我需要读入数据,合并它们,并进行一些计算并存储输出。我已经让我的脚本运行测试用例;现在我试图将它循环遍历所有文件(因此,每组有2000组3个文件)。
我当然只想一次读3。我想到了这种方法:创建一个文件数据框,其中列代表3种类型,行代表文件。我这样做:
type1Files <- list.files(path="path_to_dir", pattern="*.tsv", full.names=TRUE, recursive=FALSE)
type2Files <- list.files(path="path_to_dir", pattern="*.tsv", full.names=TRUE, recursive=FALSE)
type3Files <- list.files(path="path_to_dir", pattern="*.tsv", full.names=TRUE, recursive=FALSE)
enter files.df <- cbind.data.frame(type1=type1Files,type2=type2Files,type3=type3Files)
现在我需要按列读取这些文件,循环遍历行,这样在一个循环中只能打开3个文件。问题是我无法使用read.table读取文件,我认为这是因为文件名的格式(read.table()没有以正确的格式提供)。
head(files.df) #confirms that each file is not surrounded by double quotes as required by read.table
我的read.table声明:
type1.df <- read.table(x, header=FALSE, sep="\t", stringsAsFactors=FALSE)
对于x,我尝试了以下内容:
shQuote(files.df[1,"type1"])
dQuote(files.df[1,"type1"])
file.t <- files.df[1,"type1"]
paste0('"',file.t,'"')
我已经直接在read.table()中尝试了所有这些,并保存到对象并在read.table()中命名对象。我甚至尝试使用cat(),因为我认为转义引号可能是问题所在。什么都行不通。我要么得到&#34;意外的输入&#34;作为错误或典型错误:&#34;文件错误(文件,&#34; rt&#34;):无法打开连接。&#34;此外,如果我将错误中打印的确切文件名粘贴到我的read.table()语句中,它运行正常。所以,经过几个小时,我很难过。
这可以这样做吗? 谢谢大家的意见。
答案 0 :(得分:0)
考虑直接从列表迭代而不使用中间数据帧。使用Map
,您可以传递2,000个数据帧的每个列表,以便在所有三种类型中进行迭代cbind
调用。 cbind.data.frame
下面的列前面带有 type1 , type2 和 type3 的列。
bind_dfs <- function(x,y,z) {
xdf <- read.table(x, header=FALSE, sep="\t", stringsAsFactors=FALSE)
ydf <- read.table(y, header=FALSE, sep="\t", stringsAsFactors=FALSE)
zdf <- read.table(z, header=FALSE, sep="\t", stringsAsFactors=FALSE)
cbind.data.frame(type1=xdf, type2=ydf, type3=zdf)
}
dfList <- Map(bind_dfs, type1Files, type2Files, type3Files)
此外,要运行计算,您可以扩展bind_dfs
方法
bind_dfs <- function(x,y,z) {
xdf <- read.table(x, header=FALSE, sep="\t", stringsAsFactors=FALSE)
ydf <- read.table(y, header=FALSE, sep="\t", stringsAsFactors=FALSE)
zdf <- read.table(z, header=FALSE, sep="\t", stringsAsFactors=FALSE)
df <- cbind(xdf, ydf, zdf)
df <- #... other calculations
return(df)
}
或者在数据帧列表中使用另一个循环:
newdfList <- lapply(dfList, function(df){
df <- # ... other calculations
return(df)
})