【问题标题】:Return value from column indicated in same row从同一行中指示的列返回值
【发布时间】:2011-03-12 16:25:17
【问题描述】:

我遇到了一个需要一个多小时才能运行的简单循环,需要帮助来加快它的速度。

基本上,我有一个 31 列和 400 000 行的矩阵。前 30 列有值,第 31 列有列号。我需要每行检索第 31 列指示的列中的值。

示例行:[26,354,72,5987..,461,3] (这意味着第 3 列中的值被寻找 (72))

太慢的循环如下所示:

a <- rep(0,nrow(data)) #To pre-allocate memory
for (i in 1:nrow(data)) {
   a[i] <- data[i,data[i,31]]
}

我认为这会起作用:

a <- data[,data[,31]]

...但它会导致“错误:无法分配大小为 2.8 Mb 的向量”。

我担心这是一个非常简单的问题,所以我花了几个小时试图理解 apply、lapply、reshape 等等,但不知何故我无法掌握 R 中的矢量化概念。

矩阵实际上有更多列也进入 a 参数,这就是我不想重建矩阵或拆分它的原因。

非常感谢您的支持!

克里斯

【问题讨论】:

  • 你确定有足够的空闲内存吗?
  • 申请和朋友无关矢量化。
  • 您的示例将创建另一个矩阵,其大小与您的原始矩阵相同。听起来您的工作空间内存不足 - 长度为 400000 的数字向量需要 3.1 Mb,而矩阵应该需要 94.6 Mb。

标签: r loops vectorization


【解决方案1】:
t(data[,1:30])[30*(0:399999)+data[,31]]

这是可行的,因为您可以引用数组格式和向量格式(在本例中为 400000*31 长向量)的矩阵,首先按列计数。要按行计数,请使用转置。

【讨论】:

    【解决方案2】:

    矩阵的单索引表示法可能会使用更少的内存。这将涉及执行以下操作:

    i <- nrow(data)*(data[,31]-1) + 1:nrow(data)
    a <- data[i]
    

    以下是 R 中矩阵的单索引表示法示例。在此示例中,每行最大值的索引作为随机矩阵的最后一列附加。最后一列用于通过单索引表示法选择每行最大​​值。

    ## create a random (10 x 5) matrix                                                                                                                           
    M <- matrix(rpois(50,50),10,5)
    ## use the last column to index the maximum value of the first 5                                                                                             
    ## columns                                                                                                                                                   
    MM <- cbind(M,apply(M,1,which.max))
    ##             column ID          row ID                                                                                                                     
    i <- nrow(MM)*(MM[,ncol(MM)]-1) + 1:nrow(MM)
    all(MM[i] == apply(M,1,max))
    

    使用index matrix 是一种可能会使用更多内存但更清晰的替代方法:

    ii <- cbind(1:nrow(MM),MM[,ncol(MM)])
    all(MM[ii] == apply(M,1,max))
    

    【讨论】:

      【解决方案3】:

      尝试更改代码以一次处理一列:

      M <- matrix(rpois(30*400000,50),400000,30)
      MM <- cbind(M,apply(M,1,which.max))
      a <- rep(0,nrow(MM))
      for (i in 1:(ncol(MM)-1)) {
          a[MM[, ncol(MM)] == i] <- MM[MM[, ncol(MM)] == i, i]
      }
      

      如果最后一列的值为 i,则这会将 a 中的所有元素设置为列 i 中的值。构建矩阵比计算向量a花费的时间更长。

      【讨论】:

        猜你喜欢
        • 2013-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-27
        • 1970-01-01
        • 1970-01-01
        • 2015-02-18
        相关资源
        最近更新 更多