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

R 函数读入多个分隔的文本文件,r,function,delimited-text,R,Function,Delimited Text,使用,我创建了一个函数,该函数应读取目录中的所有文本数据集: 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)) { a

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

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
)。如何更正此问题?

正如我在评论中所说,赋值后有必要
返回()。不过,我并不认为使用
assign()
有什么意义,所以这里有一个简单的for循环,假设您希望输出是一个数据帧列表

注意,为了个人方便,我将reading函数改为
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)
}

read.delims您可以在作业中添加参数
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)
  }
}

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

函数没有返回值。尝试在最后添加
return(list.data)
。添加
return(list.data)
会打印出列表,但不会创建任何数据帧。我感觉我们正在取得进展!现在,该函数打印出数据帧(即文件的内容)。但它仍然不会在我的工作区中创建任何对象。理想情况下,它应该创建一组对象,这些对象的名称与创建它们的文件的名称相同(不带文件扩展名)。它能分解列表并从中创建单独的数据帧吗?或者这是功能之外的第二步?好的,我现在终于明白你想要实现的了。您想为每个文件创建一个对象。。。我认为这是一个错误的做法,因为你用这种方法把工作空间分散在一起,很容易失去它们的踪迹。最好将它们保存到一个列表中,将它们全部保存在一个对象中。上面的函数正是这样做的。只需将输出分配给一个对象,例如,
数据集将它们全部包含在一个列表中,这不仅是“更好的实践”,而且可以更加方便。例如,使用
do.call(rbind,…)
可以很容易地将它们绑定在一起(如果它们共享相同的格式),或者使用
lappy()
在所有数据集中执行一个公共测试。编辑:如果你真的想要单独的对象,那么看看下面CathG的建议。它修复了你的
assign()
调用,你可以得到单独的对象。注意。此函数用于加载已准备好用于后续分析的数据集。由于以这种方式创建的每个对象在该过程中都有自己的预谋角色,因此消除了不必要的混乱风险。然而,我会记住你的评论(以及关于
lappy
等的有用评论),这正是我想要的(尽管@Simon的评论有效)。太棒了!我很高兴能帮助你:-)