【问题标题】:Applying a function to a large data set将函数应用于大型数据集
【发布时间】:2016-03-14 11:47:38
【问题描述】:

我有一个大型数据集,我正在 R 中阅读 我想在其上应用Unique() 函数,以便更好地使用它,但是当我尝试这样做时,我收到了提示:

clients <- unique(clients)
Error: cannot allocate vector of size 27.9 Mb

所以我试图通过这样做来部分应用这个功能:

clientsmd<-data.frame()
n<-7316738  #Amount of observations in the dataset
t<-0
for(i in 1:200){
  clientsm<-clients[1+(t*round((n/200))):(t+1)*round((n/200)),]
  clientsm<-unique(clientsm)
  clientsmd<-rbind(clientsm)
  t<-(t+1) }

但我明白了:

 Error in `[.default`(xj, i) : subscript too large for 32-bit R

有人告诉我,我可以使用诸如“ff”或“bigmemory”(或任何其他)之类的软件包更轻松地做到这一点,但我不知道如何将它们用于此目的。

无论是告诉我为什么我的代码不起作用,还是告诉我如何利用这些软件包,我都会感谢任何形式的指导。

【问题讨论】:

  • 如果clients 是您的整个数据框,我想它有一个带有唯一标识符的列。假设此列名为id。可能值得尝试看看unique(clients$id) 或者最好是duplicated(clients$id) 是否有效。这也使您能够对clients 进行子集化以获取所有重复项,然后您可以进一步检查包括其他列。
  • 你有多少内存,data.frame 的大小是多少?如果您有 32 位或 64 位操作系统,这一点也很重要。您的问题看起来像简单的内存问题,有时调用 gc() 函数会有所帮助,或者关闭 R 并重新启动它,您可以尝试通过关闭其他正在运行的应用程序来释放系统中的更多 RAM。并且不要害怕熟悉 ffffbase 包,您可以将 data.frame 转换为 ffdf 像这样 clients_ffdf &lt;- as.ffdf(clients) 然后几乎像往常一样使用它 data.frame

标签: r


【解决方案1】:

clients是data.table的data.frame吗? data.table与data.frame相比可以处理相当大量的数据

library(data.table)

clients<-data.table(clients)

clientsUnique<-unique(clients)

duplicateIndex <-duplicated(clients) 

将给出重复的行。

【讨论】:

    【解决方案2】:

    像下面那样增加你的内存限制,然后尝试执行。

     memory.limit(4000)   ## windows specific command
    

    【讨论】:

      【解决方案3】:

      您可以使用 dplyr 包中的不同功能。

      函数 - df %&gt;% distinct(ID)

      其中 ID 是您的数据框中唯一的东西。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 2020-06-10
      • 2019-04-06
      • 1970-01-01
      • 1970-01-01
      • 2016-05-24
      • 1970-01-01
      相关资源
      最近更新 更多