2017-06-06 58 views
1

我刚刚收到一个项目,其中有几个我们想要放入表格和分析的大型文本文件(每个文件接近千兆字节)。每个文本文件由一年的数据组成,每个数据点来自三个类别中的一个,我们希望的最终结果是每个类别的一个列表,每个类别的观察结果都包含列。将多个文件读取到多个列表中

现在的做法是将每个文件读入列表中,然后根据类别拆分这些列表并每年创建三个新列表,然后将不同年份的给定类别的所有列表转换为最终名单。见下面的R文件我提出(匿名):

Year1 <- read.table(YearOneFilePath) 
table(Year1$category) 
Year1A <- Year1[Year1$category == "A",] 
Year1B <- Year1[Year1$category == "B",] 
Year1C <- Year1[Year1$category == "C",] 
rm(Year1) 
Year2 <- read.table(YeartwoFilePath) 
table(Year2$category) 
Year2A <- Year2[Year2$category == "A",] 
Year2B <- Year2[Year2$category == "B",] 
Year2C <- Year2[Year2$category == "C",] 
rm(Year2) 
Year3 <- read.table(YearThreeFilePath) 
table(Year3$category) 
Year3A <- Year3[Year3$category == "A",] 
Year3B <- Year3[Year3$category == "B",] 
Year3C <- Year3[Year3$category == "C",] 
rm(Year3) 


A <- rbind(Year1A, Year2A, Year3A) 
B <- rbind(Year1B, Year2B, Year3B) 
C <- rbind(Year1C, Year2C, Year3C) 

rm(Year1A) 
rm(Year2A) 
rm(Year3A) 
rm(Year1B) 
rm(Year2B) 
rm(Year3B) 
rm(Year1C) 
rm(Year2C) 
rm(Year3C) 

这似乎对我来说,它读取所有的数据形成文件,并复制它的两倍,而移动它,这与大量数据的像这需要很长时间和很多内存。很显然,我可以通过将YearX[YearX$Category == "Y",]直接放入rbind函数来避开YearXY列表,但这仍然意味着我在执行过程中的某个时刻有两个完整副本。有没有办法使每个文件只有一个读取文件中的文件的最后ABC列表,并且不需要额外复制所有数据?

+0

是实际的对象 - [R这么大?在驱动器上每个文件可能为1 Gb,但在R中加载一次的情况要少得多,特别是如果每​​个字段的值不是很明显。你可以在Rstudio的环境面板上检查大小,或者使用'object.size'函数。 –

+0

考虑在你的最新步骤中使用'rbindlist'更快:[link](https://stackoverflow.com/questions/15673550/为什么是rbindlist-better-than-rbind) –

+0

也许[this](https://stackoverflow.com/questions/9573055/r-selecting-subset-without-copying)如果加载几次表是好的只要你不创建副本。 –

回答

0
library(data.table) 

Year1 <- fread(YearOneFilePath) 
Year1[, .N ,by = category] 
Year1A <- Year1[Year1$category == "A",,] 
Year1B <- Year1[Year1$category == "B",,] 
Year1C <- Year1[Year1$category == "C",,] 
rm(Year1) 
gc() 
#YES garbage collection may help ;) 
A <- rbind(Year1A, Year2A, Year3A) 
rm(Year1A) 
rm(Year2A) 
rm(Year3A) 
gc() 

对于这里分裂是一个多方法,

split_list1=split(Year1 ,Year1$category) 
Year1A <-split_list1[[1]] 
Year1B <-split_list1[[2]] 
Year1C <-split_list1[[3]] 

也看到split data table to small tables R