2016-06-20 16 views
0

Ich habe versucht, eine Liste mit den Koordinaten eines Vektors, die die gleichen Werte haben.Subsetting Elemente eines Vektors in R

Beispiel: für einen Vektor Points = (2, 2, 3, 6, 3, 6, 3), Koordinaten, die den gleichen Wert haben, sind (1,2), (3, 5, 7) und (4,6). So soll die Ausgabe etwas wie

[[1]] 
1 2 

[[2]] 
3 5 7 

[[3]] 
4 6 

gerade sein, die Notwendigkeit dieser Funktion zu kontextualisieren: Ich versuche, zufällig zu simulieren geht mit mehreren Ausgangspunkten. Sobald sich alle gegebenen Ketten treffen, wird die mit dem kleinsten Index aktualisiert. Der Vektor Points ist die Position aller Wanderungen zu einem bestimmten Zeitpunkt t. Ich muss bei jedem Zeitschritt überprüfen, welche Ketten den gleichen Wert haben, um nur die mit dem kleinsten Index zu aktualisieren. In diesem speziellen Beispiel würden nur die Ketten 1, 3 und 4 zum Zeitpunkt t+1 aktualisiert werden.

+0

So X, Y, W 3 in Position 2, Z, V auf 9 in Position 3. Sind Sie sagen ' Index 'ist ...? Und die gewünschte Ausgabe würde aussehen? – Chris

+0

Sind alle Vektoren gleich lang? Was möchten Sie tun, wenn sie nicht sind? – gung

+0

@gung, ja alle Vektoren sollten die gleiche Länge haben. Ich hätte genauer sein sollen. Ich versuche mehrere zufällige Wege zu laufen und wenn einige von ihnen zusammenwachsen, bewegen sie sich danach zusammen. Das, was ich gefragt habe, ist eine Art zu überprüfen, ob zwei oder mehr Wege zusammengewachsen sind. Ich werde die Frage bearbeiten. – KirkLand

Antwort

0

Vielleicht so etwas wie folgt aus:

X = c(2, 3, 4) 
Y = c(4, 3 ,5) 
Z = c(8, 8 , 9, 6) 
W = c(3, 3, 7,4) 
V = c(9, 9, 9,3) 

findeev<-function(vi){ #takes a list of vector(s) to extract from `allv` 
    nms=paste("v",vi,sep="") 
    ne=max(sapply(allv[vi],length)) #max number of elements 
    ine=1:ne 
    # Computes sd along the positions of all vetors 
    rest=apply(cbind(sapply(allv[vi],function(vt)vt[ine])),1,sd) 
    # determine if some vectors have the same value across a position 
    resc=which(rest==0) 
    if(length(resc)){ret=allv[vi];ret$pos=resc 
    names(ret)[-length(ret)]<-nms 
    ret} else invisible() 
} 

allv=list(X,Y,Z,W,V) 
findeev(c(3,5)) #exmple 

sol=list();j=1 # This contains all pairs 
for(i in (length(allv)-1):2){ 
    # compare all combinations of vector using `findeev` 
    res<-apply(t(combn(1:length(allv),i)),1,findeev) 
    if(is.null(res))next #not found continues 
    # eliminate NAs form list and assign that to sol[[j]] 
    sol[[j]]<-Filter(Negate(function(x) is.null(unlist(x))), res) 
    j=j+1 
} 
sol 

Sie erhalten:

> findeev(c(3,5)) 
$v3 
[1] 8 8 9 6 

$v5 
[1] 9 9 9 3 

$pos 
[1] 3 

> sol 
[[1]] 
[[1]][[1]] 
[[1]][[1]]$v1 
[1] 2 3 4 

[[1]][[1]]$v2 
[1] 4 3 5 

[[1]][[1]]$v4 
[1] 3 3 7 4 

[[1]][[1]]$pos 
[1] 2 



[[2]] 
[[2]][[1]] 
[[2]][[1]]$v1 
[1] 2 3 4 

[[2]][[1]]$v2 
[1] 4 3 5 

[[2]][[1]]$pos 
[1] 2 


[[2]][[2]] 
[[2]][[2]]$v1 
[1] 2 3 4 

[[2]][[2]]$v4 
[1] 3 3 7 4 

[[2]][[2]]$pos 
[1] 2 


[[2]][[3]] 
[[2]][[3]]$v2 
[1] 4 3 5 

[[2]][[3]]$v4 
[1] 3 3 7 4 

[[2]][[3]]$pos 
[1] 2 


[[2]][[4]] 
[[2]][[4]]$v3 
[1] 8 8 9 6 

[[2]][[4]]$v5 
[1] 9 9 9 3 

[[2]][[4]]$pos 
[1] 3 
+0

Vielen Dank für die Bearbeitung der Antwort. Es fällt mir jedoch schwer, den Code zu verstehen. Könnten Sie einige Kommentare hinzufügen, um die Rolle jedes einzelnen Codes zu verdeutlichen? Wenn wir eine "Teilmenge" von Vektoren erstellen würden, die auf einer entsprechenden Koordinate denselben Wert haben (z. B. X, Y, W würde eine Teilmenge und Z, V eine andere bilden), unabhängig vom Index, an dem sie zuerst liegt auftreten, wie können wir den Code ändern? Danke nochmal. – KirkLand

Verwandte Themen