压缩R中的索引

时间:2013-07-24 07:20:14

标签: r

我的数据如下:

    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)

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

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

2 个答案:

答案 0 :(得分:0)

也许你可以通过将索引类型转换为'factor'来节省一些内存。

例如:

> 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

答案 1 :(得分: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]]