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

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

我的问题如下:
我有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. 

它运作良好但是,因为我有总共条目> 2.2百万,这是非常慢的(运行需要2.5天……).因此,我正在寻找一种加快这一过程的方法.

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

v1[IDs]

对于每个矢量(1到4)重复该操作.请注意,通常只有约50%的名称在两个向量之间重叠(因此,只有50%的用于索引的ID /名称最初出现在向量的名称中).

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

我很感激有关如何更快地完成此过程的任何提示.因为我必须多次重复这个过程,所以每次我必须生成这样一个对象时,我真的不能等待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,但您可以轻松地将其转换回矩阵

随着N增长,加速似乎增加:N = 5000快5倍,N = 10000快30倍,N = 50000快67倍,其中N是v1的长度.

点赞