优化R中的向量索引和矩阵创建

时间:2013-11-25 10:09:06

标签: r optimization vector matrix indexing

首先,如果这个话题已在其他地方讨论过,我很抱歉,但在搜索时找不到任何相关内容。

我的问题如下: 我有4个名称部分重叠的向量,我想将所有这些数据组织成一个矩阵。我希望最终矩阵具有至少一个输入向量中存在的所有名称的条目。我使用了以下代码。

IDs <- unique(c(names(v1), names(v2), names(v3), names(v4))) 
mat <- matrix(c(v1[IDs], v2[IDs], v3[IDs], v4[IDs]), nrow=length(IDs), ncol=4)
mat[is.na(mat)] <- 0 
# This last line is to convert NAs generated when the entry isn't present in all vectors into 0 values. 

效果很好但是,因为我有总共条目&gt; 2.2百万,这是非常慢的(运行需要2.5天......)。因此,我正在寻找加快这一进程的方法。

我尝试使用其他结构(例如创建数据框而不是矩阵),但没有很大的改进。经过一些测试,似乎瓶颈是以下步骤(即使单独考虑):

v1[IDs]
对于每个向量(1至4)重复

。请注意,通常只有约50%的名称在两个向量之间重叠(因此,只有50%的用于索引的ID /名称最初出现在向量的名称中)。

我监视了一下在此过程中使用的CPU和内存,似乎它不是内存问题(在此过程中6个空闲Gb仍然是免费的)。

我很感激有关如何更快地完成此过程的任何提示。由于我必须多次重复这个过程,每次我必须生成这样一个对象时,我真的无法等待2天。

感谢。 =)

菲利普。

1 个答案:

答案 0 :(得分:2)

如果您使用reshape2包,则dcast功能可以完成此任务。 首先将矢量堆叠在data.frame

df <- rbind(data.frame(IDs=names(v1), value=v1, vec=1),
data.frame(IDs=names(v2), value=v2, vec=2),
data.frame(IDs=names(v3), value=v3, vec=3),
data.frame(IDs=names(v4), value=v4, vec=4))

然后以宽泛的格式对其进行转换:

dcast(df, ids ~ vec, value.var="value")

这会输出data.frame,但您可以轻松将其转换回matrix

加速似乎随着N的增长而增加:使用N=5000快5倍,使用N=10000快30倍,N=50000快{67}快N长度为v1