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