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

时间:2017-04-10 18:38:55

标签: r tidyr

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

structure(list(id1 = c(1, 2, 3, 4, 4, 4, 4, 4, 4, 4), id2 = c("a",
"b", "c", "d", "e", "f", "g", "h", "i", "j"), b1 = c(NA, NA,
NA, 1L, 1L, 1L, 1L, 1L, 1L, 1L), b2 = c(1, NA, NA, NA, NA, NA,
1, 1, 1, 1), b3 = c(NA, 1, NA, NA, NA, NA, NA, NA, 1, 1), b4 = c(NA,
NA, 1, NA, NA, NA, NA, NA, 1, 1)), .Names = c("id1", "id2", "b1",
"b2", "b3", "b4"), row.names = c(NA, 10L), class = "data.frame")

df
   id1 id2 b1 b2 b3 b4
1    1   a NA  1 NA NA
2    2   b NA NA  1 NA
3    3   c NA NA NA  1
4    4   d  1 NA NA NA
5    4   e  1 NA NA NA
6    4   f  1 NA NA NA
7    4   g  1  1 NA NA
8    4   h  1  1 NA NA
9    4   i  1  1  1  1
10   4   j  1  1  1  1

我需要将其设置为长格式,而只保留值1.当然,我尝试使用gather中的tidyr以及data.table中的melt无效因为它们的记忆要求是爆炸性的。我的原始数据有0和1,但我用NA填充了零,希望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

0 个答案:

没有答案