2016-04-27 3 views
0

Ich habe einen Vektor a mit fehlendem Wert (der fehlende Wert ist 5 und es könnten mehr fehlende Werte vorhanden sein). Ich möchte oberen Dreiecksdatenrahmen (Matrix) s parallel erstellen. Die letzte Datenrahmen s sollte sein, dass auf a Index auf b basiert:Paralleler oberer Dreiecksdatenrahmen (Matrix) mit fehlendem Wert in 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 

ich den folgenden Code für sie verwenden:

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 

Antwort

0

ist die Lösung:

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

Ein einfacher Ansatz, um die outer Funktion.

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:

Wenn Sie wollen nicht die gesamte Matrix im Voraus zu bauen, den fehlenden Wert aus dem Vektor x im Voraus entfernen wird das tun. Hier

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

Danke, aber ich will nicht die ganze Matrix im Voraus bauen aufgrund Komplexität des Codes innerhalb der Schleifen. Ich möchte es wie im Beispiel gezeigt ohne zusätzliche Zeilen und Spalten erstellen. Die Zeilen sind OK in meinem Beispielcode nur etwas in den Zeilen zu ändern. – Avi

+0

@Avi Bitte beachten Sie das Update. –

+0

Danke nochmal. Es sieht viel besser aus, aber ich muss es parallel machen (mit foreach) und zusätzlich gibt es einen komplexen Code, der von i und j abhängt. Bitte beachten Sie mein beigefügtes Beispiel. (Außerdem verwende ich 'a' als Vektor und du verwendest es als x) – Avi