我知道我这里有一个简单的问题,但我似乎无法得到它。我有多个.txt文件,我想通过循环使用read.table,以便每个.txt文件都是自己的data.frame。问题在于能够使用自己唯一的变量名称读取每个.txt文件名
例如:
path = "dir" #my directory
filenames <- list.files(path)
for (i in 1:length(filenames))
{
ID <- filenames[i]
ID <- paste(ID, "average_table", sep = "_")
read.table(filenames[i], header=TRUE) # error about "cannot open connection" and "cannot open file ID: no such file or directory"
}
例如,如果我有sub1.txt,sub2.txt,sub3.txt ...我想简单地将每个文件作为data.frame读取,每个文件都包含其.txt文件的变量名称。最后添加的“average_table”(例如,使用sub1.txt进行第一次循环将导致sub1_average_table的data.frame变量)。
我使用了lapply,但这当然会创建一个列表,这不是我想要的。读取每个文件的最佳方法是什么,同时将其相应的data.frame命名为.txt文件名?谢谢。
答案 0 :(得分:0)
您可以使用assign
获取您要求的解决方案。
此外:为了摆脱read.table
可以解决的问题
找不到文件,您应该使用file.path
来合并path
包含要打开的文件的名称。 (你现在的解决方案
使read.table
查找活动工作目录中的文件。)
path = "dir" #my directory
filenames <- list.files(path)
result_names <- structure(
.Data = gsub(
pattern = "\\.txt",
replacement = "_average_table",
x = filenames),
.Names = filenames)
for (.file in filenames) {
assign(
x = result_names[.file],
value = read.table(
file = file.path(path, .file),
header = TRUE),
envir = .GlobalEnv)
}
记录:我认为使用解决方案要好得多
基于sapply
,正如@Richard Scriven的评论所述。
该解决方案只会向您的全局工作区添加一个对象,并且
如果由于某种原因想检查,你可以使用子设置
一个特定的数据框架。