首先,如果这个话题已在其他地方讨论过,我很抱歉,但在搜索时找不到任何相关内容。
我的问题如下: 我有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天。
感谢。 =)
菲利普。
答案 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
。