r-合并数据帧显示错误:无法分配大小为1.4 Gb的矢量



我的RAM是4 GB,我使用的是64位Windows和R。我想在公共密钥列(日期)的基础上合并大约25个数据帧。我在互联网和各种论坛上搜索堆栈溢出。然而,我得到了错误"错误:无法分配大小为xGb的矢量"。数据帧看起来像

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 ))

我有大约25个数据帧,如A、B和C(每个帧有大约3000行)。我正在使用如下所示的堆栈溢出解决方案。A、 B和C数据帧在最后一行显示NA。然而,他们不断地犯错误。请帮忙。filename=list.files(path=path,full.names=TRUE)#文件是上面讨论的A、B和C#类型

datalist = lapply(filenames, function(x){read_excel(x,sheet=1)})
df6<-datalist %>% Reduce(function(dtf1,dtf2) inner_join(dtf1,dtf2,by="Date"), .)

file_list <- list.files()
for (file in file_list)
{

# if the merged dataset does exist, append to it
if (exists("dataset")){
temp_dataset <-read_excel(file)
dataset<-merge.data.frame(dataset, temp_dataset, by=c('Date'))
rm(temp_dataset)
}
# if the merged dataset doesn't exist, create it
if (!exists("dataset")){
dataset <- read_excel(file)
}
}

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]'

A、 B和C数据帧在最后一行显示NA。有没有办法在上面的代码行中删除这些NA,然后运行程序。愿这能消除错误。

您的描述和错误中似乎有几个问题。这可能不是一个简单的代码解决方案,而是一系列令人困惑的问题,所以我会尽我所能,不要看到你的代码崩溃和自焚。

你需要非常狡猾,才能在不产生膨胀的情况下在循环中完成所有事情。

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

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

你可能需要使用if语句来非法,无论它们是日期、数字、字符还是因子,然后对每个语句应用正确的as.,但如果你想让合并工作,绝对必须在各个方面都准确。(例如:as.dateas.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()。因为有很多文件,所以考虑使用print(yourfilename.type)语句返回失败合并的名称,如果当前迭代失败,则使用next()语句转到下一个文件。

通过这种方式,你可以在遇到一个不会合并的文件后保持循环运行,这样你就可以建立一个失败文件的列表,并开始追踪它们的不同之处,以解决问题。有时在excel中更容易做到这一点(如果一列需要有6个数字,前面有零,请手动格式化)。

而且。。。如果您能够使用CSV而不是Excel文件(如果它们是单个工作表,而不是分层的),则转换它们,您将释放RAM。或者考虑编写一个脚本,将一个工作簿转换为多个工作表,并将其保存为csv文件,以减少文件中的脂肪,并限制处理过程中对JUGS和Java的依赖。

也许不是你想要的答案,但这只是一个开始。

数据从excel文件导入R程序。这在最后一行中创建了许多NA。通过使用下面的代码删除NA,可以节省大量内存,并有助于有效地合并数据帧。这些代码一次性从数据帧列表中删除NA。

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

最新更新