R 延长具有大量稀疏性的超大数据帧

R 延长具有大量稀疏性的超大数据帧,r,tidyr,R,Tidyr,我有这样一个数据帧(但大小为160亿): 我需要将其转换为长格式,同时只保留值1。当然,我试过使用tidyr中的gather,以及meltfrom data.table,但都没有用,因为它们的内存需求是爆炸性的。我的原始数据有0和1,但我用NA填充了0,希望NA.rm=TRUE选项有助于解决内存问题。但事实并非如此 只要保留和延长数据框,我的数据框就可以很容易地放入我的内存中 与使用标准方法相比,有没有更好的方法来实现这一点?可以接受合理的计算作为更好的内存匹配的折衷 我的期望输出相当于: li

我有这样一个数据帧(但大小为160亿):

我需要将其转换为长格式,同时只保留值1。当然,我试过使用
tidyr
中的
gather
,以及
melt
from data.table,但都没有用,因为它们的内存需求是爆炸性的。我的原始数据有0和1,但我用NA填充了0,希望
NA.rm=TRUE
选项有助于解决内存问题。但事实并非如此

只要保留和延长数据框,我的数据框就可以很容易地放入我的内存中

与使用标准方法相比,有没有更好的方法来实现这一点?可以接受合理的计算作为更好的内存匹配的折衷

我的期望输出相当于:

library(dplyr)
library(tidyr)
df %>% gather(b, value, -id1, -id2, na.rm = TRUE)
   id1 id2  b value
1    4   d b1     1
2    4   e b1     1
3    4   f b1     1
4    4   g b1     1
5    4   h b1     1
6    4   i b1     1
7    4   j b1     1
8    1   a b2     1
9    4   g b2     1
10   4   h b2     1
11   4   i b2     1
12   4   j b2     1
13   2   b b3     1
14   4   i b3     1
15   4   j b3     1
16   3   c b4     1
17   4   i b4     1
18   4   j b4     1

# or
reshape2::melt(df, id=c("id1","id2"), na.rm=TRUE)
# or 
library(data.table)
melt(setDT(df), id=c("id1","id2"), na.rm=TRUE)
目前,在我的完整数据集上调用
gather
会产生以下错误,我认为这是由于内存问题造成的:

Error in .Call("tidyr_melt_dataframe", PACKAGE = "tidyr", data, id_ind,  :
  negative length vectors are not allowed

在您的示例中,值==1的过滤器是多余的。如果您有一个重现错误的示例,这将非常有用。是的……我在将NA替换为零后没有清理它。:)内存不足时也会失败。服务器有256GB内存,但显然,这还不够存储此数据。:)希望有一个更有效的内存解决方案来解决像我这样的稀疏情况。最后一步是创建索引/:
ro=which(d[-(1:2)]==1);co=(ro-1)%/%nrow(d)+1;ro=(ro-1)%%nrow(d)+1
内存又用完了?@user20650:我想
d[-(1:2)]==1
可能是内存出现问题的那个?(顺便说一句,它可以替换为
,其中(d[-(1:2)]==1,TRUE)
)。也许,按列收集行索引可以节省“nrow(d)*length(d)”逻辑--
ro=lappy(df[-(1:2)]、函数(elt)所需的内存,该函数(as.logical(elt));co=代表(顺时针方向(ro)、长度(ro));ro=未列出(ro,FALSE)
Error in .Call("tidyr_melt_dataframe", PACKAGE = "tidyr", data, id_ind,  :
  negative length vectors are not allowed