将多个文件读取到多个列表中
问题描述:
我刚刚收到一个项目,其中有几个我们想要放入表格和分析的大型文本文件(每个文件接近千兆字节)。每个文本文件由一年的数据组成,每个数据点来自三个类别中的一个,我们希望的最终结果是每个类别的一个列表,每个类别的观察结果都包含列。将多个文件读取到多个列表中
现在的做法是将每个文件读入列表中,然后根据类别拆分这些列表并每年创建三个新列表,然后将不同年份的给定类别的所有列表转换为最终名单。见下面的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
列表,但这仍然意味着我在执行过程中的某个时刻有两个完整副本。有没有办法使每个文件只有一个读取文件中的文件的最后A
,B
和C
列表,并且不需要额外复制所有数据?
答
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]]
是实际的对象 - [R这么大?在驱动器上每个文件可能为1 Gb,但在R中加载一次的情况要少得多,特别是如果每个字段的值不是很明显。你可以在Rstudio的环境面板上检查大小,或者使用'object.size'函数。 –
考虑在你的最新步骤中使用'rbindlist'更快:[link](https://stackoverflow.com/questions/15673550/为什么是rbindlist-better-than-rbind) –
也许[this](https://stackoverflow.com/questions/9573055/r-selecting-subset-without-copying)如果加载几次表是好的只要你不创建副本。 –