2017-05-22 4 views
1

Ich habe folgenden Code, den ich mit for-Schleife ausführen, um ein 3D-Array "newarr" zu generieren.R: Verwenden von Mapply, um Schleife zu vermeiden

n1<-c(1,2,3,4,5) 
n2<-c(3,4,5,6,7) 
n3<- c(4,5,6,7,8) 

afun <- function(y,p,q,r){ 
       calc=1/(1+(((y-p)/q)^(2*r))) 
       return(calc) 
     } 

newarr<- array(dim = c(4,5,5)) 
Amat<-matrix(data=c(1:10,NA,NA,NA,NA,15:20),nrow = 4,ncol = 5) 
Bmat<-matrix(data=c(1:6,NA,NA,NA,NA,11:20),nrow = 4,ncol = 5) 
Qmat<- +(!is.na(Amat) & !is.na(Bmat)) 

for(i in 1:5){ 
    res<-afun(Amat,n1[i],n2[i],n3[i]) 
    newarr[,,i]<- res 
} 

Ich möchte Mapply verwenden (oder eine Funktion anwenden) statt for Schleife. arr2 < - array ((mapply (funktion (x, y, n1, n2, n3) if (x == 1) afun (y, n1, n2, n3) sonst 0, Qmat, Amat, n1, n2, n3)), C (4,5,5))

Der folgende Code scheint aber ohne Bedingung zu helfen, wie weiter beschrieben:
newarr < - array (mapply (afun, n1, n2, n3, MoreArgs = list (y = Amat)), c (4,5,5))

Ich möchte eine Bedingung mit Qmat (eine 4x5-Matrix mit 0 und 1), so dass, wenn '0' beobachtet wird, sollte keine Operation enthalten durchgeführt werden und '0'-Wert zur Füllmatrix zurückgeben. Führen Sie für 1s in Qmat die Funktion 'afun' aus, und geben Sie den Wert zu "newarr" zurück, um eine 3D-Matrix zu bilden.

Danke für die Hilfe !!

+0

Was ist die Logik Ihres Teils mit 'Qmat'? Es ist nicht klar aus Ihrer Frage. – jogo

+0

Ich werde einige genaue Informationen liefern. Amat ist eine Matrix wie unten gezeigt: Amat <-Matrix (Daten = c (1: 10, NA, NA, NA, NA, 15: 20), nrow = 4, ncol = 5) Bmat <-Matrix (Daten = c (1: 6, NA, NA, NA, NA, 11: 20), now = 4, ncol = 5) Qmat <- + (! is.na (Amat) &! is.na (Bmat)). Qmat wird eine Matrix von 4 x 5 mit den Werten 0 und 1 erzeugen. Ich möchte eine Bewertung des "newarr" -Werts durchführen, wenn Qmat 1 entspricht. Hoffe, es erklärt. – Sam

+0

Lassen Sie uns sehen, ob ich den Punkt bekommen habe: Für jede 1 in Qmat erhalten Sie das 3D-Array 'newarr' (ist es immer das gleiche 3D-Array?) Und für jede 0 in Qmat möchten Sie 0 (oder eine 3 -Dimensional Array in der gleichen Form wie 'newarr' mit Werten 0?). Wie sollte das Ergebnis aussehen, ein 5-dimensionales Array? Bitte stellen Sie Ihre Klarstellungen über die Logik in Ihrer Frage, dh bearbeiten Sie Ihre Frage: https://stackoverflow.com/posts/44115125/edit – jogo

Antwort

0

Dies wird Ihnen das gewünschte Ergebnis:

newarr <- array(mapply(afun, n1,n2,n3, MoreArgs = list(y=Amat)), c(4,5,5)) 

dies ist die implizite SIMPLIFY mit = TRUE von mapply(). Mit SIMPLIFY = TRUE wird jedes Ergebnis auf einen Vektor reduziert. (Eine Matrix ist ein Vektor mit einer Dimension Attribut)
Eine andere Variante ist

array(unlist(mapply(afun, n1,n2,n3, MoreArgs = list(y=Amat), SIMPLIFY = FALSE)), c(4,5,5)) 

Hier finden Sie eine Liste von Matrizen als Ergebnis erhalten von mapply(). Sie müssen die Registrierung aufheben.

+0

Danke .... es funktioniert !! – Sam

+0

Vielen Dank ... !! Aber ich habe eine Bedingung hinzuzufügen ... Das 'afun' sollte funktionieren, wenn Werte in einer Matrix 1 sind. Betrachten wir die Matrix mit 1 und 0. Könntest du mir bitte auch dabei helfen. Qmat <-matrix (c (rep (1), 0,0,0,0), nrow = 4, ncol = 5) .... – Sam

Verwandte Themen