2017-01-03 3 views
0

glaube, ich habe zwei Matrizen mat und obj:R: put Ergebnisse der Funktion in entsprechenden ursprünglichen Position der Eingänge nach einer Teilmenge

time <- c(1, 1, 2, 2, 3, 3) 
money <- c(2, 2, 4, 4, 6, 6) 
ownership <- c(1, 0, 1, 0, 1, 0) 
randomstuff <- matrix(runif(18),nrow = 3) 
mat <- rbind(time, money, ownership, randomstuff) 

dat <- c(1, 0, 2, 0, 3, 0) 
obj <- matrix(dat,nrow=1) 

ich sie durch eine Funktion leite:

f <- function(mat,obj){fake function outputting a vector the same length as obj} 

soln <- f(mat, obj). 

wo soln ist eine 1x6-Matrix.

Wie kann ich (elegant - das ist eigentlich eine 70000+ Spaltenmatrix) verwandeln die Matrizen mat und obj zu:

time <- c(1, 2, 3) 
money <- c(2, 4, 6) 
ownership <- c(1, 1, 1) 
mat <- rbind(time, money, ownership, randomstuff) 

dat <- list(1, 2, 3) 
obj <- matrix(dat,nrow=1) 

mit den soln eine 1x3-Matrix ist.

soln=   [,1]  [,2]  [,3]  
     [1,] 4.151969 5.759826 5.537563 

wenn die Entscheidung eine Spalte aus mat auszuschließen wird in ownership[]=0 und das gleiche für obj basierend auf dem Wert. Die zusätzliche Schwierigkeit besteht darin, dass ich in der Lage sein muss, die Ausgabe in soln der zugeordneten ursprünglichen Position in einer größeren SOLN Matrix zuzuordnen. In diesem Fall sind die Spalten 1,3,5. Das Eigentum wird nach dem Zufallsprinzip zugewiesen, so dass es kein anderes Muster als die oben beschriebenen Nullen gibt.

Der Vorschlag zu verwenden:

obj2 <- obj[, as.logical(ownership), drop = FALSE] 
mat2 <- mat[, as.logical(ownership)] 

funktioniert perfekt für dieses Stück. Wie setze ich die soln Werte in Positionen 1,3,5 einer größeren SOLN Matrix? Die folgende SOLN Matrix ist ein Beispiel für eine mögliche Ausgabe. In diesem Fall möchte ich, dass die Spalten 1, 3 und 5 mit dieser Funktion gefüllt werden. Nachfolgende Operationen (gleiche Operation verschiedene ownership) wird Spalten füllen 2, 4 und 6.

SOLN =   [,1] [,2]  [,3]  [,4]  [,5]  [,6] 
     [1,] 4.151969 1.08251 5.759826 3.368613 5.537563 3.471643 

Irgendwelche Ideen?

+0

'mat [, as.logical (Besitz)]; obj [, as.logical (Besitz), drop = FALSE] '? –

+0

@DavidArenburg Danke! Dies bringt mich sicherlich auf die Teilmenge Stück. Es ist das Mapping zurück, das mich jetzt noch hat. Ich werde die Frage bearbeiten. – jjhold

+0

Ich bin sehr verwirrt, wie die 'SOLN'-Matrix aussehen sollte. Könnten Sie bitte am Ende eine Beispielausgabe geben, die Sie wollen? – Barker

Antwort

0

Ich habe eine teilweise Antwort. Ich kann den Spalten-Index finden:

soln2 <- c(7,8,9) 

index <- which(ownership==1, arr.ind=TRUE) 
> index 
[1] 1 3 5 

Nun, ich weiß, dass ich ein Ergebnis Raum schaffen muß:

SOLN <- matrix(data=NA,nrow=1,ncol=6) 
> SOLN 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] NA NA NA NA NA NA 

> SOLN[,1]<-soln2[1] 
> SOLN[,3]<-soln2[2] 
> SOLN[,5]<-soln2[3] 
> SOLN 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 7 NA 8 NA 9 NA 

Ich brauche eine Möglichkeit, dies über 70.000 mal. Es gibt wahrscheinlich eine APPLY Funktion, die ich verwenden sollte, aber ich weiß nicht, was es ist. Ich habe eine For-Loop-Lösung.

> for (i in 1:length(index)){ 
+ j=index[[i]] 
+ print(j) 
+ SOLN[,j]=soln2[i] 
+ } 
[1] 1 
[1] 3 
[1] 5 
> SOLN 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 7 NA 8 NA 9 NA 

Irgendwelche Vorschläge für eine elegantere Lösung würden geschätzt werden!

+1

Ich habe keine Ahnung, was 'SOLN' oder' soln2' sind, wie sie erzeugt werden und was um Himmels Willen willst du damit machen. Ihre Frage ist unübersehbar. Und wenn Sie 'SOLN' mit' soln2' füllen wollen, können Sie einfach 'SOLN' machen.logisch (Besitz)] <- soln2' also nicht sicher, was du da mit dieser 'for'-Schleife machen willst –

Verwandte Themen