我有一个包含大约50,000个文本文件的文件夹。我只想读取大约6,000个这些文件,具体取决于文件名。所有文件都编号为5.txt,16.txt等。
这是我的尝试:
library(plyr)
library(qpcR)
files.content <- list.files("~/RFiles/user", "*.txt", full.names=T)
ID <- as.character(unique(ratings.df$RID))
# take the ID from a column of a dataframe further down in script
# [1] "18617" "31213" "31203" "14975" "14749" "31192" etc
read.data <- function(x) {
num <- as.numeric(gsub("[^\\d]", "", x, perl=T))
# gives me a list of numbers from folder
select.files <- if(num %in% ID) {
x1 <- file(x, open="rt")
x2 <- readLines(x1, warn=F, encoding="UTF-8")
x3 <- c(num, x2)
}
}
table.files <- lapply(files.content, read.data)
temp.vec <- do.call(qpcR:::rbind.na, table.files)
table.df <- data.frame(temp.vec, stringsAsFactors=F)
有人有更好的建议吗?由于某种原因,它仍会将50,000个文件读入数据帧,而不是选定的6,000个。
编辑:将10,000改为50,000。
答案 0 :(得分:1)
在lapply中运行函数之前,子集要读取的文件。我猜你的do.call中的rbind.na正在读取一个空白元素,该元素是从额外44k文件上的lapply生成的并且粘在所有那些NA中。无论如何,这里有一些基本的子集代码:
# create similar matching scenario
files <- paste0(1:200,'.txt')
id <- sample(files,50,replace = F)
id <- gsub('\\.txt','',id)
# subset the files needed; change regex to your case
index <- sub('[^0-9]*([0-9]{1,5})\\.txt','\\1',files) %in% id
filestoread <- files[index]
# however you need to read in, this is not tested
table.files <- lapply(filestoread,readLines,open = file(x, open="rt"),warn = F,encoding = "UTF-8")
# end with do.call and data.frame
还有一个注意事项,我浏览了rbind.na文档,它似乎为你提供了一堆额外的NA行,使每个数据框的大小相同。即rbind.na有10行和1000行的两个data.frames,你最终会得到1010行数据和990行NA。常规rbind只会为您提供1010个通常需要的数据。在您的情况下,这是数据的6k数据帧,所有NA的44k data.frames,每个都是您最大文件的大小。 rbind可能只是跳过你原始代码上的空白元素。