【问题标题】:import large number of .txt files to data.frame, include empty .txt files by giving them a row data.frame将大量 .txt 文件导入 data.frame,通过给它们一行 data.frame 来包含空的 .txt 文件
【发布时间】:2016-10-25 15:58:12
【问题描述】:

我尝试在 R 中导入大量 .txt 文件。其中一些 .txt 文件是空的,但我仍然希望将它们包含在我的 data.frame 中,具体是哪些 .txt 文件空的。使用以下功能,我可以将所有必要的 .txt 文件导入列表:

file_list <- list.files()
myList <- lapply(file_list, function(x) {tryCatch(read.table(x, header = F, sep = '|'), error=function(e) NULL)})

但是,当我使用以下代码将此列表更改为 data.frame 时:

myDataframe <- rbind.fill(lapply(myList, function(f) {as.data.frame(Filter(Negate(is.null), f))}))

我丢失了有关哪些 .txt 文件为空的信息。

最终,我希望在每一行上添加一列,其中包含 .txt 文件的名称,例如通过 list.files()。这样,我可以看到哪些行是空的。

【问题讨论】:

  • 非常感谢您抽出宝贵的时间和思考:)!
  • 好的,如果有人偶然发现了同样的问题,以下方法对我有用: library(plyr) #make a data.frame 并计算每个参与者按下按钮的次数:file_list

标签: r


【解决方案1】:

这是您问题的解决方案,但不是您问题的具体答案。

取决于您的文本文件的大小。您应该考虑切换到data.table。一个漂亮的系统,用于以高效的内存方式快速处理大文件。

install.packages("data.table")
library(data.table)
file_list <- list.files()

Results <-  NULL
for (i in file_list){
  # data.table command to read txt files
  i.file <- tryCatch(fread(i,colClasses="character"), error=function(e) e)

  if(!class(i.file)[1]=="data.table"){
    # This condition checks that no errors occured
    i.file <- data.table(cbind(txt.file=i,is.empty="YES",
                         message=i.file$message))
  } else if(nrow(i.file)==0){
    # Just in case files are still empty even though no error
    i.file <- data.table(cbind(txt.file=i,is.empty="YES",
                         message=NA))
  } else {
    i.file[,txt.file:=i]
    i.file[,is.empty:="No"]
  }
  Results <- rbind(Results,i.file,fill=TRUE)
  rm(i.file);gc()
}

# to find which files are empty
Results[is.empty=="YES"][,txt.file]
# double check error types
Results[is.na(message)][,message] 
# expect all to be something like 'file is empty'

# if you insist on using data.frames
Results <- data.frame(Results)

这应该适合你。该脚本可以转换为与 lapply 一起使用的函数,但我希望它易于理解和概括。

我也是data.table 的忠实粉丝,过渡到它对我很有帮助。有关该软件包的更多信息,请查看此cheatsheet

编辑:修改了脚本,使其可以容纳带有空格的空文件

【讨论】:

  • 感谢您的帮助!不幸的是,它不起作用:“fread 中的错误(i,colClasses = “character”,verbose = TRUE):在跳过或自动启动后输入为空或完全空白。使用 verbose=TRUE 再次运行。”我添加了“verbose = T”,但错误仍然存​​在。
  • 发生此错误是因为您的“空”文件并非完全为空。它们包含一个空格。现在我不确定这是所有“空”文件还是其中一些文件的情况,所以我在上面编辑的脚本中考虑了这一点。
  • 非空文件。您期望有多少行和列?如果其中一个大于 1,那么上面的编辑脚本应该可以工作。
  • 非常感谢!我赞成您的回答,但显然我的声誉很低!
  • 请勾选答案旁边的复选标记,以便此问题可以视为已关闭
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-15
  • 2014-04-24
  • 2016-08-01
  • 2012-11-16
  • 2013-05-15
相关资源
最近更新 更多