2016-04-27 40 views
0

我有一个缺失值的矢量a(缺失值为5,可能有更多缺失值)。 我想创建上三角形数据帧(矩阵)s并行。 最终的数据帧s应该是基于a指数b在R中缺失值的平行上三角形数据帧(矩阵)

> 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 

回答

0

这里是解决方案:

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 
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 

UPDATE:

如果你不想建全矩阵提前,从载体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 
+0

谢谢,但我不希望建立在事先整个矩阵由于代码回路内的复杂性。我想创建它,如示例中所示,不添加行和列。在我的示例代码中,行只有在行中可以更改。 – Avi

+0

@Avi请参阅更新。 –

+0

再次感谢。它看起来好多了,但我需要并行执行(使用foreach),另外,而不是'+',有一个复杂的代码依赖于i和j循环值。请参考我附带的例子。 (另外,我使用'a'作为矢量,并将它用作x) – Avi