导入文件夹中的所有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中的变量?的主要内容,如果未能解决你的问题,请参考以下文章

将不同的表连接到 C# 组合框中的不同项目

如何将多个 csv 文件连接到 pandas 数据框中,文件名作为行名?

plsql怎么导入excel数据

plsql怎么把excel导入数据库

将系列连接到具有列名的数据框中

如何将连接到网络的所有IP地址保存在文本文件中