导入文件夹中的所有txt文件,连接到数据框中,使用文件名作为R中的变量?
Posted
技术标签:
【中文标题】导入文件夹中的所有txt文件,连接到数据框中,使用文件名作为R中的变量?【英文标题】:Import all txt files in folder, concatenate into data frame, use file names as variable in R? 【发布时间】:2014-02-02 03:02:18 【问题描述】:我有一个包含 142 个制表符分隔的文本文件的文件夹。每个文件有 19 个变量,然后是下面的一些行(通常不超过 30 行,但会有所不同)。 我想在 R 中自动对这些文件做几件事,我似乎无法用我的代码得到我想要的东西。我是循环新手,我从 *** 上的帖子中获得了这两个部分的代码,但似乎无法弄清楚如何组合它们的功能。
我想把文件读入R的时候把文件名变成变量,这样每一行都有标识文件名
将所有文件(带有文件名变量且无标题)连接到一个尺寸为 Yx19 的数据帧中,其中 Y=结果行的数量。
我可以使用以下代码创建 142 个数据帧的列表:
myFiles = list.files(path="~/Documents/ForR/", pattern="*.txt")
data <- lapply(myFiles, read.table, sep="\t", header=FALSE)
names(data) <- myFiles
for(i in myFiles)
data[[i]]$Source = i
do.call(rbind, data)
我可以用 19 个变量创建我想要的数据框,但文件名不存在:
files <- list.files(path="~/Documents/ForR/.", pattern=".txt")
DF <- NULL
for (f in files)
dat <- read.csv(f, header=F, sep="\t", na.strings="", colClasses="character")
DF <- rbind(DF, dat)
如何将文件名(如果可能不带 .txt)作为变量添加到循环中?
【问题讨论】:
【参考方案1】:添加到循环 dat$file
files <- list.files(path="~/Documents/ForR/.", pattern=".txt")
DF <- NULL
for (f in files)
dat <- read.csv(f, header=F, sep="\t", na.strings="", colClasses="character")
dat$file <- unlist(strsplit(f,split=".",fixed=T))[1]
DF <- rbind(DF, dat)
do.call 中的 row.names 不应该采用 names(list)[n].i 格式,其中 i 是 1:number_of_rows_for_data.frame n?所以你可以从 row.names 中创建一列
data <- lapply(myFiles, read.table, sep="\t", header=FALSE)
combined.data <- do.call(rbind, data)
combined.data$file_origin <- row.names(combined.data)
【讨论】:
请注意,当文件数量很大时,这可能会很慢。每次扩展DF
,都会分配新内存,并将内容从旧内存复制到新内存。【参考方案2】:
您可以使用basename
获取最后一个路径元素(文件名),例如:
(files = file.path("~","Documents","ForR",c("file1.txt", "file2.txt")))
"~/Documents/ForR/file1.txt" "~/Documents/ForR/file2.txt"
(basename(files))
[1] "file1.txt" "file2.txt"
然后sub
删除扩展名“.txt”:
sub('.txt','',basename(files),fixed=TRUE)
[1] "file1" "file2"
【讨论】:
以上是关于导入文件夹中的所有txt文件,连接到数据框中,使用文件名作为R中的变量?的主要内容,如果未能解决你的问题,请参考以下文章