读取多个表并将每个表保存为自己的data.frame

时间:2016-04-23 17:03:14

标签: r loops filenames read.table

我知道我这里有一个简单的问题,但我似乎无法得到它。我有多个.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文件名?谢谢。

1 个答案:

答案 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的评论所述。 该解决方案只会向您的全局工作区添加一个对象,并且 如果由于某种原因想检查,你可以使用子设置 一个特定的数据框架。