合并Data.frames显示错误:无法分配大小为1.4 Gb的向量

合并Data.frames显示错误:无法分配大小为1.4 Gb的向量,r,memory-management,dataframe,merge,R,Memory Management,Dataframe,Merge,我的RAM是4GB,我使用的是64位Windows和R。我想在公共键列(日期)的基础上合并大约25个数据帧。我在互联网和各种论坛上搜索了stack overflow。但是,我得到一个错误“error:cannotallocate vector of size x Gb”。 data.frames看起来像 A <- data_frame(Date = c("1/1/1990","1/2/1990","1/3/1990"), MXAR = c(342.369,342.369,525.528 )

我的RAM是4GB,我使用的是64位Windows和R。我想在公共键列(日期)的基础上合并大约25个数据帧。我在互联网和各种论坛上搜索了stack overflow。但是,我得到一个错误“error:cannotallocate vector of size x Gb”。 data.frames看起来像

A <- data_frame(Date = c("1/1/1990","1/2/1990","1/3/1990"), MXAR = c(342.369,342.369,525.528 ))
B <- data_frame(Date = c("11/30/2009","12/1/2009","12/2/2009"), MXBD = c(1000,1007.13,998.55 ))
C <- data_frame(Date = c("6/1/2005","6/2/2005","6/6/2005"), MXBH = c(1209.21,1205.74,1195.33 ))
跑步时

datalist = lapply(filenames, function(x){data.table(read_excel(x,sheet=1), key="Date")})
该程序抛出许多警告,如

In read_xlsx_(path, sheet, col_names = col_names, col_types = col_types,             ... :
  [1601, 1]: expecting date: got '[NULL]'

A、 B和C data.frames显示最后一行中的NA。是否有办法删除上述代码行中的NA,然后运行程序。这可能会删除错误。

您的描述和错误中似乎存在一些问题。这可能不是一个简单的代码解决方案,而是一系列令人困惑的问题,所以我会尽我所能,而不会看到您的代码崩溃并烧掉我自己

你需要非常狡猾才能在一个循环中完成所有事情,而不会造成膨胀

如果要在日期上进行合并,首先要做的是使用
str(df)
检查每个帧(合并前),以查看日期字段的结构和数据类型是否完全相同。日期时间作为因素输入,有时甚至作为字符数据输入,这并不少见

如果它们不完全相同,则在合并循环中创建一个函数(在循环中运行之前单独测试),以遍历每个文件$date字段并转换为统一的日期时间,如POSIXct

您可能需要使用if语句来确定它们是日期、num、char还是Factors,然后将正确的
as.
应用到每个语句中,但如果您希望合并工作,则在各个方面都必须完全准确。(示例:
as.date
as.POSIXct

如果有任何因素,您需要嵌套您的转换,以避免奇怪的强制。您可以使用:

as.POSIXct(as.character(df$col),%m/%d/%Y)

将新文件合并到大文件后,请使用
rm()
(将文件名放在rm语句的括号内)在环境中删除新导入的文件,只保留合并后的文件

然后您需要运行
gc()
,从内存中清除删除的文件。如果不这样做,它可能会保留在内存中并影响下一个文件

需要注意的是,在许多复制过程中,R数据帧存在于内存中的2-4个副本中。如果这些文件很大,并且不使用rm(df)和gc()清除它们,那么肯定会有问题

另外,在直接使用Excel文件时,您很可能使用JAVA接口,它有自己的堆,并且占用内存。而且R不会告诉它的JAVA工作人员像任何人可能喜欢的那样高效地清除,系统只会在它无法正常工作时才这样做,因此您最终会得到越来越少的用于合并的可访问内存

确保合并后在循环中包含rm()和gc()。因为有很多文件,请考虑使用<代码>打印(YouFielNe.type)< /Cord>语句,将失败合并的名称返回到<代码> NEXT()/<代码>语句,如果当前迭代失败,则转到下一个文件。 通过这种方式,您可以在命中一个不会合并的文件后保持循环运行,这样您就可以建立一个失败文件的列表,并开始查找它们的不同之处,以解决问题。有时在excel中这样做更容易(如果列需要6个数字宽,前面有零,请手动设置格式)

而且…如果您能够使用CSV而不是Excel文件(如果它们是单个工作表,而不是分层的),请将它们转换,这样您就可以释放RAM。或者考虑编写一个脚本将工作簿转换成几个工作表,并将它们保存为CSV文件,以将文件中的FAT修剪,并限制您对Jug和java的依赖性。p>
可能不是您想要的答案,但这只是一个开始。

从您的描述和错误来看,您似乎遇到了一些问题。这可能不是一个简单的代码解决方案,而是一系列令人困惑的问题,所以我会尽我所能,而不会看到您的代码崩溃并烧掉我自己

你需要非常狡猾才能在一个循环中完成所有事情,而不会造成膨胀

如果要在日期上进行合并,首先要做的是使用
str(df)
检查每个帧(合并前),以查看日期字段的结构和数据类型是否完全相同。日期时间作为因素输入,有时甚至作为字符数据输入,这并不少见

如果它们不完全相同,则在合并循环中创建一个函数(在循环中运行之前单独测试),以遍历每个文件$date字段并转换为统一的日期时间,如POSIXct

您可能需要使用if语句来确定它们是日期、num、char还是Factors,然后将正确的
as.
应用到每个语句中,但如果您希望合并工作,则在各个方面都必须完全准确。(示例:
as.date
as.POSIXct

如果有任何因素,您需要嵌套您的转换,以避免奇怪的强制。您可以使用:

as.POSIXct(as.character(df$col),%m/%d/%Y)

将新文件合并到大文件后,请使用
rm()
(将文件名放在rm语句的括号内)在环境中删除新导入的文件,只保留合并后的文件

然后您需要运行
gc()
,从内存中清除删除的文件。如果不这样做,它可能会保留在内存中并影响下一个文件

需要注意的是,在许多复制过程中,R数据帧存在于内存中的2-4个副本中。如果这些文件很大,并且不使用rm(df)和gc()清除它们,那么肯定会有问题

另外,在直接使用Excel文件时,您很可能使用JAVA接口,它有自己的堆,并且占用内存。并且R不会告诉它的JAVA工作程序作为effi进行清除
reshape::merge_all(datalist, by="Date")
datalist = lapply(filenames, function(x){data.table(read_excel(x,sheet=1), key="Date")})
In read_xlsx_(path, sheet, col_names = col_names, col_types = col_types,             ... :
  [1601, 1]: expecting date: got '[NULL]'
filenames=list.files(path=path, full.names=TRUE)
datalist4 = lapply(filenames, function(x){read_excel(x,sheet=1)})
str(datalist4)
datalist5<-lapply(datalist4, na.omit)#removing NA row from each data.frames