2016-06-20 4 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 на 3 в положении 2, Z, V на 9 в положении 3. Вы говорите, ' index 'is ...? И нужный результат будет выглядеть? – Chris

+0

Все ли векторы одинаковой длины? Что вы хотите сделать, если это не так? – gung

+0

@gung, да все векторы должны иметь одинаковую длину. Я должен был быть более конкретным. Я пытаюсь запустить несколько случайных блужданий, и если некоторые из них объединились, они будут двигаться вместе после этого. Это я спросил о том, как проверить, слились ли две или несколько прогулок. Я отредактирую вопрос. – 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

Благодарим за редактирование ответа. Однако мне сложно понять код. Не могли бы вы добавить некоторые комментарии, чтобы прояснить роль каждой части кода? Кроме того, если бы мы должны были создать «подмножество» векторов, которые имеют одинаковое значение в соответствующей координате (например, X, Y, W образуют одно подмножество, а Z, V - другое), независимо от индекса, в котором он сначала Как мы можем изменить код? Еще раз спасибо. – KirkLand

Смежные вопросы