2016-06-20 14 views
0

同じ値を持つベクトルの座標を使ってリストを作成しようとしています。ベクトルの要素をサブセット化するR

例:ベクトルPoints = (2, 2, 3, 6, 3, 6, 3)の場合、同じ値を持つ座標は(1,2)、(3,5,7)、(4,6)です。だから、出力はちょうどこの機能の必要性を文脈する

[[1]] 
1 2 

[[2]] 
3 5 7 

[[3]] 
4 6 

のようなものでなければなりません:私は、ランダムなシミュレートしようとしている複数の出発点と歩きます。与えられたチェーンが互いに衝突すると、最小のインデックスを持つチェーンが更新されます。ベクトルPointsは、ある時間ステップtでのすべての歩行の位置である。最小のインデックスを持つものだけを更新するために、どのタイムステップでどのチェーンが同じ値を持つかを検証する必要があります。この特定の例では、鎖1,3および4のみが瞬間t+1で更新される。

+0

だから、X、Y、W 2位に3、Z、V上の9上の位置3にあなたが '言っていますindex 'は...ですか?そして、望ましい出力は次のようになります。 – Chris

+0

すべてのベクトルは同じ長さですか?彼らがいない場合、あなたは何をしたいですか? – gung

+0

@gung、はいすべてのベクトルは同じ長さでなければなりません。私はより具体的にすべきだった。 私は複数のランダムウォークを実行しようとしていますが、それらのいくつかが合体すると、その後一緒に移動します。私が尋ねたのは、2つ以上の散歩が合体したかどうかをチェックする方法です。 質問を編集します。 – KirkLand

答えて

0

たぶん、このような何か:

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 

あなたが得る:

> 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

答えを編集していただきありがとうございます。私はコードを理解するのに苦労しています。各コードの役割を明確にするためにいくつかのコメントを追加できますか? また、最初のインデックスに関係なく、それぞれの座標(ex、X、Y、Wは1つのサブセットを構成し、Z、Vは別のもの)に同じ値を持つベクトルの「サブセット」を作成する場合は、コードがどのように変更されますか? もう一度ありがとうございます。 – KirkLand

関連する問題