在R中将文件夹中的所有txt文件导入并拼接成数据框,使用文件名作为变量?

7
我有一个带有142个制表符分隔文本文件的文件夹。 每个文件都有19个变量,然后是一些行(通常不超过30行,但会有所变化)。
我希望在R中自动完成这些文件的几个操作,但似乎无法通过我的代码获得想要的准确结果。 我对循环不熟悉,我从StackOverflow的以前的帖子中获取了两个代码部分,但似乎无法弄清如何组合它们的功能。
  1. 当将文件读入R时,我希望将文件名转换为变量,以便每行都具有识别文件名
  2. 将所有文件(带有文件名变量和无标题)连接到一个数据框中,其尺寸为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 扩展名)作为变量添加到循环中?
2个回答

8

将代码加入循环中 dat$file <- unlist(strsplit(f,split=".",fixed=T))[1]

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 为数据框 n 的行数(从1开始计数)? 这样你就可以从 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)

1
请注意,当文件数量非常大时,这可能会非常缓慢。每次扩展“DF”时,都会分配新的内存,并将内容从旧内存复制到新内存中。 - Paul Hiemstra

3
您可以使用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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接