2017-08-05 5 views
3

Ich versuche, einige Informationen aus einer Tabelle zu extrahieren, und ich versuche zu vermeiden für Schleifen oder gelten Typ Funktionen.Verwenden Sie ifelse, um Informationen aus einer Matrix zu extrahieren

Angenommen, ein Vektor m

m=c(1:20) 
m 
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 

und eine Matrix g

x1=c(0,1,0,1,2,0,1,2,3,0,1,2,3,4,0,1,2,3,4,5) 
x2=c(1,0,2,1,0,3,2,1,0,4,3,2,1,0,5,4,3,2,1,0) 
u=.4*x1^.5+.6*x2^.5 
g=cbind(x1,x2,u) 
g 
     x1 x2   u 
[1,] 0 1 0.6000000 
[2,] 1 0 0.4000000 
[3,] 0 2 0.8485281 
[4,] 1 1 1.0000000  
[5,] 2 0 0.5656854 
[6,] 0 3 1.0392305 
[7,] 1 2 1.2485281 
[8,] 2 1 1.1656854 
[9,] 3 0 0.6928203 
[10,] 0 4 1.2000000 
[11,] 1 3 1.4392305 
[12,] 2 2 1.4142136 
[13,] 3 1 1.2928203 
[14,] 4 0 0.8000000 
[15,] 0 5 1.3416408 
[16,] 1 4 1.6000000 
[17,] 2 3 1.6049159 
[18,] 3 2 1.5413485 
[19,] 4 1 1.4000000 
[20,] 5 0 0.8944272 

I für jedes Element von M soll, prüfen, ob die Summe g [1] + g [2] ist gleich diesem Element. Für alle Fälle, in denen die Bedingung WAHR ist, möchte ich, dass mein Code die Position desjenigen zurückgibt, der den höchsten Wert von g [, 3] hat. Wenn beispielsweise m = 5, ist die Bedingung x [, 1] + x [, 2] == 5 bei 15, 16, 17, 18, 19 und 20 WAHR. Davon hat Eintrag 17 den höchsten Wert , also möchte ich, dass mein Code den Wert 17 zurückgibt.

Also würde ich am Ende einen Vektor der Länge = Länge (m) erwarten, der für jedes Element von m angibt, wo der Maximalwert von g ist [, 3] die die obige Bedingung erfüllt. Der Vektor sollte wie folgt sein:

1,4,7,11,17,0,0,0,0,0,0...,0 

wobei, wenn m = 1, die Zeile, in der g [1] + g [2] == 1 wird die Zeile 1 , wenn m = 2 ist die Zeile, in der g [, 1] + g [, 2] == 2 ist Zeile 4 und so weiter.

Derzeit verwende ich gelten über jede Zeile von g, aber dieser Prozess wird tausend Mal wiederholt, und mein Code ist sehr langsam. Um die Dinge zu beschleunigen, griff ich auf ifelse in einem Bemühen, Dinge in einer vektorisierten Weise zu tun.

Was ich versuche, ist das zu tun folgendes:

ifelse(m>0,which(g[,3]==max(g[which(g[,1]+g[,2]==m),3])),0) 

Wenn ich dies läuft Ich erhalte

[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 

während, wenn ich m mit 5 ersetzen, es einen Vektor von 17s zurück . Es scheint, dass es nur das erste Element von m anstelle des gesamten Vektors verwendet. Irgendwelche Vorschläge, wie ich diese Arbeit machen kann, oder eine Alternative, die die gleiche Arbeit machen könnte, ist mehr als willkommen.

+0

Kann u der erwartete Ausgabe zeigen? Versuchen Sie 'which (äußere (m, g [, 1] + g [, 2], '=='), arr.ind = TRUE)' oder kann 'g [, 3] [max.col (äußere (m , g [, 1] + g [, 2], '=='))] ' – akrun

+0

Danke. Ich habe die Frage bearbeitet, um die erwartete Ausgabe einzuschließen. – KGeor

Antwort

2

könnten Wir verwenden outer mit max.col

m1 <- t(outer(g[,1] + g[,2], m, `==`)* g[,3]) 
max.col(m1) * (rowSums(m1!= 0) !=0) 
#[1] 1 4 7 11 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+1

Das hat den Job gemacht! Danke vielmals! – KGeor

Verwandte Themen