用于读入多个分隔文本文件的函数

时间:2014-12-19 11:55:23

标签: r function multiple-files delimited-text

使用this answer,我创建了一个应该读入目录中所有文本数据集的函数:

read.delims = function(dir, sep = "\t"){

  # Make a list of all data frames in the "data" folder
  list.data = list.files(dir, pattern = "*.(txt|TXT|csv|CSV)")

  # Read them in
  for (i in 1:length(list.data)) {
    assign(list.data[i],
           read.delim(paste(dir, list.data[i], sep = "/"),
                      sep = sep))
  }

}

但是,即使指定目录中有.txt和.csv文件,也不会创建R对象(我猜测这是因为我在函数中使用read.delim )。如何纠正这个?

2 个答案:

答案 0 :(得分:1)

正如我在评论中所说,分配后需要return()一个值。我真的没有看到使用assign()的重点,所以这里有一个简单的for循环,假设你希望你的输出是一个数据帧列表。

请注意,为了方便起见,我将阅读功能更改为read.table()。您可能想要调整它。

read.delims <- function(dir, sep = "\t"){

  # Make a list of all data frames in the "data" folder
  list.data <- list.files(dir, pattern = "*.(txt|TXT|csv|CSV)")
  list.out <- as.list(1:length(list.data))

  # Read them in
  for (i in 1:length(list.data)) {
    list.out[[i]] <- read.table(paste(dir, list.data[i], sep = "/"), sep = sep)
  }
  return(list.out)
}

也许您还应该在正则表达式中添加$

干杯。

答案 1 :(得分:1)

您可以在作业中添加参数envir,如下所示:

read.delims = function(dir, sep = "\t"){

  # Make a list of all data frames in the "data" folder
  list.data = list.files(dir, pattern = "*.(txt|TXT|csv|CSV)")

  # Read them in
  for (i in 1:length(list.data)) {
    assign(list.data[i],
           read.delim(paste(dir, list.data[i], sep = "/"),
                      sep = sep),
          envir=.GlobalEnv)
  }
}

这样做,您的对象将在全局环境中创建,而不仅仅在函数环境中创建