【问题标题】:Parallel upper triangle dataframe (matrix) with missing value in RR中缺少值的平行上三角数据框(矩阵)
【发布时间】:2016-04-27 07:41:36
【问题描述】:

我有一个带有缺失值的向量a(缺失值为 5,可能还有更多缺失值)。 我想并行创建上三角数据框(矩阵)s。 最终的数据帧s 应该是基于b 上的a 索引:

> s
   1  2  3  4   6
1 22 32 42 52  82
2  0 42 52 62  92
3  0  0 62 72 102
4  0  0  0 82 112
6  0  0  0  0 142

我使用以下代码:

library(foreach)
library(doParallel)

    b<-c(11,21,31,41,61)
    a<-c(1,2,3,4,6)
    N<-length (a)
    cl<-makeCluster(4)
    registerDoParallel(cl)

    #loop
    #result is a list of vectors
    s <- foreach(i=a) %:%
      foreach(j=i:N, .combine='c') %dopar% {
        as.numeric(b[i]+b[j])  } 


    stopCluster(cl)

    s <- t(vapply(s, function(x) {
      x <- rev(x)
      length(x) <- N
      rev(x)
    }, FUN.VALUE = numeric(N)))

    s[lower.tri(s)] <- 0

【问题讨论】:

    标签: r foreach dataframe doparallel


    【解决方案1】:

    使用outer 函数的简单方法。

    x <- 1:6
    a <- outer(x, x, "+")
    b <- a[-5, -5]
    b[lower.tri(b)] <- 0
    b
    #      [,1] [,2] [,3] [,4] [,5]
    # [1,]    2    3    4    5    7
    # [2,]    0    4    5    6    8
    # [3,]    0    0    6    7    9
    # [4,]    0    0    0    8   10
    # [5,]    0    0    0    0   12
    

    更新:

    如果您不想提前构建整个矩阵,请提前从向量x 中删除缺失值即可。

    x <- c(1:4, 6)
    a <- outer(x, x, "+")
    a[lower.tri(a)] <- 0
    a
    #      [,1] [,2] [,3] [,4] [,5]
    # [1,]    2    3    4    5    7
    # [2,]    0    4    5    6    8
    # [3,]    0    0    6    7    9
    # [4,]    0    0    0    8   10
    # [5,]    0    0    0    0   12
    

    【讨论】:

    • 谢谢,但由于循环内的代码复杂性,我不想提前构建整个矩阵。我想创建它,如示例中所示,不添加行和列。在我的示例代码中,这些行是可以的,只是在行中有所改变。
    • 再次感谢。它看起来好多了,但我需要并行执行(使用 foreach),此外,除了“+”之外,还有一个复杂的代码,它取决于 i 和 j 循环值。请参考我附上的例子。 (另外,我用'a'作为向量,你用它作为x)
    【解决方案2】:

    解决办法如下:

    library(foreach)
    library(doParallel)
    
           b<-c(11,21,31,41,61,71)
            a<-c(1,2,3,4,6)
            N<-length (a)
            cl<-makeCluster(4)
            registerDoParallel(cl)
    
            #loop
            #result is a list of vectors
            s <- foreach(i=a) %:%
              foreach(j=a[i:N], .combine='c') %dopar% {
                as.numeric(b[i]+b[j])  } 
    
    
            stopCluster(cl)
    
            s <- t(vapply(s, function(x) {
              x <- rev(x)
              length(x) <- N
              rev(x)
            }, FUN.VALUE = numeric(N)))
    
            s[lower.tri(s)] <- 0
        s<-as.data.frame(s)
        colnames(s)<-a
        rownames (s)<-a
    
        > s
           1  2  3  4   6
        1 22 32 42 52  82
        2  0 42 52 62  92
        3  0  0 62 72 102
        4  0  0  0 82 112
        6  0  0  0  0 142
    

    【讨论】:

      猜你喜欢
      • 2021-06-10
      • 1970-01-01
      • 2016-03-28
      • 2017-06-17
      • 2015-08-27
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多