2016-06-09 11 views
1

Ich habe zwei Listen (A und B), die jeweils 5 Vektoren der Länge 3. Ich habe auch eine 3x3-Matrix Z.Verwendung mapply Operationen auf Listen von Vektoren auszuführen: Probleme mit Indexspezifikation

Ich möchte führe Operationen an den Elementen von A durch, benutze B und Z und gib sie an eine 3x5-Matrix aus. Ich bin in der Lage, dies zu tun erfolgreich eine for-Schleife als

#Create two lists of vectors 
A = list(c(1,2,1), c(2,1,2), c(3,2,2),c(1,2,5),c(1,4,2)) 
B = list(c(2,3,1), c(1,3,4), c(2,5,2), c(2,4,1),c(1,4,1)) 
#Create 3x3 matrix 
Z = rbind(c(2,3,5),c(3,2,3), c(1,1,1)) 

#initialize empty 3x5 matrix 
Y = matrix(NA,3,5) 

for (i in 1:3) 
{ 
    for (j in 1:5) 
    { 
    #Take the ith element of the jth vector from A, and divide it by 
    #the dot product of the jth vector from B and the ith row of Z 
    Y[i,j] = A[[j]][i]/sum(B[[j]]*Z[i,]) 
    } 
} 

Diese Erträge folgt (für Y)

  [,1]  [,2]  [,3]  [,4]  [,5] 
[1,] 0.05555556 0.06451613 0.10344828 0.04761905 0.05263158 
[2,] 0.13333333 0.04761905 0.09090909 0.11764706 0.28571429 
[3,] 0.16666667 0.25000000 0.22222222 0.71428571 0.33333333 

Ich versuche, herauszufinden, wie mapply zu verwenden, um dies effizienter zu machen.

Bisher habe ich diese bekam:

mapply(function(x,y,z) x/sum(y*z), x=A,y=B,z = Z) 

aber das ist nicht richtig funktioniert. Ich schätze, dass vielleicht die Aufspaltung der Aufgabe in vielleicht zwei separate Mapplys der Fall sein könnte, und vielleicht müsste ich die Matrizen und Listen reorganisieren, so dass die Indizes irgendwie zusammenpassen. Ich hatte einige Erfolge mit der Anwendungsfamilie, aber ich bin noch nicht flüssig genug, um herauszufinden, wie ich dieses Problem am besten angehen kann. Ich würde mich über jede Führung freuen.

Antwort

1

Ich entschied mich, es in zwei Schritte zu brechen, wie Sie dachten. Hier ist ein Weg, es zu tun:

BZ <- lapply(B, FUN = function(y) 
    apply(Z, 1, FUN = function(x) sum(y*x))) 

mapply(function(x,y) x/y, x = A, y = BZ) 

      [,1]  [,2]  [,3]  [,4]  [,5] 
[1,] 0.05555556 0.06451613 0.10344828 0.04761905 0.05263158 
[2,] 0.13333333 0.04761905 0.09090909 0.11764706 0.28571429 
[3,] 0.16666667 0.25000000 0.22222222 0.71428571 0.33333333 
+0

Ah! ich danke dir sehr. Ihre Antwort löst nicht nur mein Problem, sondern hilft mir auch dabei, mit der Bewerberfamilie besser zu werden. Sehr geschätzt! – spacediver

Verwandte Themen