0

我的数据如下:

    V1   V2
1 10001 1003
2 10002 1005
3 10002 1007
4 10003 1001
5 10003 1005
...

这些是边缘列表数据。

V1 的索引非常稀疏,只有 [1..10001] 中的几个数字被占用。

例如,它类似于max(V1) = 20000 but range(V1) = [10000, 20000].

我想压缩索引。

这是我所做的:

sorted <- sort(data, index.return = T)

但是对于重复的节点索引,会返回不同的排序索引。另外,我需要返回索引的逆索引(或 sorted$ix)。

我是 R 新手,我该怎么做?

4

2 回答 2

0

也许您可以通过将索引类型转换为“因子”来节省一些内存。

例如:

> d <- data.frame(x = rep(c(1000, 2000), 10000), y=rep(c(100, 150), 10000)) 
> object.size(d)
320448 bytes
> d1 <- data.frame(x=as.factor(d$x), y=as.factor(d$y))
> object.size(d1)
160992 bytes
于 2013-07-24T08:30:18.440 回答
0

我是 R 新手,代码可能很难看。如果您发现任何难看的东西,请修改它。

主要思想是执行唯一性并执行查找表。

# index compression
V1_uniq = unique(data[,1])
V3_uniq = unique(data[,3])

user_n = length(V1_uniq)
ast_n = length(V3_uniq)

rst = sort(V1_uniq, index.return = T)
LUT1 = c(0)
for ( i in 1 : length(rst$x) )
    LUT1[V1_uniq[i]] = rst$ix[i]

usr_comp = LUT1[data[,1]]

rst = sort(V3_uniq, index.return = T)
LUT3 = c(0)
for ( i in 1 : length(rst$x) )
    LUT3[V3_uniq[i]] = rst$ix[i]

ast_comp = LUT3[data[,3]]
于 2013-07-24T09:31:23.697 回答