【问题标题】:Optimizing vector indexing and matrix creation in R在 R 中优化向量索引和矩阵创建
【发布时间】:2013-12-09 23:03:35
【问题描述】:

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

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

它运行良好,但由于我的条目总数 > 220 万,这非常慢(运行需要 2.5 天......)。因此,我正在寻找一种方法来加快这一进程。

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

v1[IDs]

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

我稍微监控了进程中使用的 CPU 和内存,看来这不是内存问题(在此过程中 6 个空闲 Gb 仍然可用)。

如果有任何关于如何加快此过程的提示,我将不胜感激。由于我必须多次重复此过程,因此每次生成这样的对象时,我真的不能等待 2 天。

谢谢。 =)

菲利普。

【问题讨论】:

    标签: r optimization vector matrix indexing


    【解决方案1】:

    如果您使用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 倍,其中Nv1 的长度。

    【讨论】:

    • 完美运行,谢谢!代码运行不到一分钟。作为比较,这是我使用初始方法处理大约 50k 个条目(共 220 万个)所需的时间......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 2013-11-18
    • 2016-04-24
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多