在 R 中使用 dplyr 处理大数据集(400 万行)。

6

我正在使用dplyr对我的巨型数据框(b)进行一些数据操作。我已经成功地在较小的数据子集上工作。我猜测我的问题出在数据框的大小上。

我有一个具有4百万行和34列的数据框。

我的代码如下:

df<-b %>%
  group_by(Id) %>%
  mutate(numberoflead = n(),#lead sayısı
         lastcreateddateoflead=max(CreatedDate),#last date of lead
         firstcreateddateoflead=min(CreatedDate),#first date of lead
         lastcloseddate=max(Kapanma.tarihi....),#last closed date of kapanm tarihi
         yas=as.Date(lastcloseddate)-as.Date(firstcreateddateoflead),#yas
         leadduration=as.Date(lastcreateddateoflead)-as.Date(firstcreateddateoflead)) %>%#lead duration
  inner_join(b %>% 
               select(Id, CreatedDate, lasttouch = Lead_DataSource__c),
             by = c("Id" = "Id", "lastcreateddateoflead" = "CreatedDate")) %>% #lasttouch
  inner_join(b %>% 
               select(Id, CreatedDate, firsttouch = Lead_DataSource__c),
             by = c("Id" = "Id", "firstcreateddateoflead" = "CreatedDate")) %>%  #firsttouch
  inner_join(b %>% 
               select(Id, Kapanma.tarihi...., laststagestatus = StageName),#laststagestatus
             by = c("Id" = "Id", "lastcloseddate" = "Kapanma.tarihi...."))

它在我数据帧的较小子集上运行良好,但当我将以上代码运行到完整的数据帧上时,运行时间非常长,并最终崩溃。我认为问题可能出在数据帧的4百万行上。

有人有什么建议如何解决这个问题吗?谢谢你们的帮助!


2
尝试使用 data.table,即 setDT(b)[, c('numberoflead', 'lastcreateddateoflead') := .(.N, max(CreatedDate)), Id] - akrun
2
还要看看 dtplyr(dplyr 的数据表后端)和 dbplyr(dplyr 的 SQL 数据库后端)。 - Ben Bolker
@BenBolker,我已经尝试使用dtplyr了,但现在我遇到了这个错误:Error: cannot allocate vector of size 17.5 Mb。你有什么想法吗? - Ozgur Alptekın
你翻译的程序相关内容如下:这意味着您仍然遇到内存限制。 您有多少RAM? 您可能需要一个内存不足解决方案(例如dbplyr或参见https://cran.r-project.org/web/views/HighPerformanceComputing.html)。 - Ben Bolker
1个回答

1

最近我也遇到了一个类似大小的代码问题。我认为你的问题是R内存空间的大小。你可以在R编辑器中检查全局环境上方的容量。我的内存由于大数据量而过载,然后程序经常崩溃。

我的解决方案是编写两个独立的代码片段。在第一个代码片段中,我将所有数据集合并到一个文件中,并以此结束代码:

saveRDS(file, file = "filename.Rds") # save as one object to save work space in working directory as R data file

然后关闭文件,在R内存中手动清除(点击“释放未使用的R内存”),并开始一个新代码,在其中加载先前创建的文件。
setwd("PathWhereTheFileIsSaved") # set working directory
complete <- readRDS(file = "filename.Rds") # load previously in code 1 created data 

后来,我的代码在不超载内存的情况下运行正常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接