我的数据如下:
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的新手,我该怎么做?
答案 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]]