2015-04-04 4 views
-1

Здесь у меня есть функция, которую я хочу уравнять количество остановок от движущегося объекта. Для этого есть список позиций (в котором эта функция называется Trip), а продолжительность - длина пути, но будет использоваться при дальнейшей разработке кода.Проблемы с созданием нового списка

Теперь, чтобы узнать количество остановки всей поездки, что я должен сделать это для каждой поездки, которая имеет разные позиции, как:

х, у, г

10,11,13

12,11,14

13,11,15, ....

** 20,11,35

20,11,35

20,11,35 ** Сравните себя с тем, чтобы узнать, какие именно.

На этом последнем месте, где объект остается в том же месте, мы можем заключить, что он был остановлен. Итак, чтобы знать остановку, нам нужно сравнить каждую позицию со следующими.

Я пишу этот код:

StopsNumber <- function(Trip,Duration) 
{ 
    i=1 
    aux = Trip 

    while(i<length(Trip)) 
    { 
    if(aux[i] == aux[i+1] && aux[i] == aux[i+2]){ 
     Stop = aux[i] 
     NStops = Nstops+1 
    } 
    aux = [aux+1] 
    i=i+1 
    } # end 

    return (Stop,Nstops) 
} 

проблема MThe Я думаю, что я не знаю, как создать список вещей. Например: on Stop = aux [i] Я не знаю, правильно ли работает. Потому что я хочу сделать Stop be list (или вектор с aux, (те позиции, где объект был тихим). И делая это, если есть несколько остановок, последний заменяет остальные. Может кто-нибудь помочь мне? Спасибо

+1

что поездка? что такое продолжительность? можете ли вы определить их явно? это лучше, чем 10 строк непонятных объяснений. Как и итоговый результат. Cheerios. –

ответ

0

ваших определений движения, интервалы и остановки остаются неясными. Поэтому код достаточно долго, чтобы избежать недоразумений. в противном случае это может быть сводилось одну или две строки. Сначала несколько четких определений срезанных

  • Интервал между промежутками между точками xyz
  • Движение происходило в интервале, если начальная и конечная точки t различаются в пространстве
  • Остановка - это интервал без движения после интервала движения
  • Вы можете предположить, что объект был (или не был) в движении до первого интервала. Таким образом, остановка может произойти уже в первом интервале.

a tip: попробуйте использовать функции loop(), sapply(), lapply() и foreach() вместо низкоуровневых for() и while().

код

#your data added some more positions 
mixed.vector = c(
10,11,13, 
12,11,14, 
13,11,15, 
20,11,35, 
20,11,35, #this is a stop 
20,11,35, 
13,11,25, 
10,20,30, 
10,20,30) #this is a stop 

#convert data to appropiate data structure. 
#I suggest a matrix. List of vector would also do 
#some tricks to convert (multiple ways to do this) 
#mixed vector to matrix 
xyz.matrix = matrix(mixed.vector,ncol=3,byrow=TRUE) 
print(xyz.matrix) #each row is a position, columns are x, y and z respectively. 

#matrix to list of vectors (if this structure is preferred) 
list_of_vectors = split(xyz.matrix,1:dim(xyz.matrix)[1]) 
print(list_of_vectors) 

#list of vectors to matrix (if this is how your data initially is ordered) 
xyz.matrix = do.call(rbind,list_of_vectors) 
print(xyz.matrix) #and we're back with a matrix 

#function checking if intervals have no movement 
#(total number of intervals is number of positions minus 1) 
find_interval_with_movement = function(XYZ.m) { 
    nrows = dim(XYZ.m)[1] #scalar of n.position rows 
    interval_with_movement = !apply(XYZ.m[-nrows,]==XYZ.m[-1,],1,all) #check pairs of row if x y z match. 
    return(interval_with_movement) 
} 

#function finding stops, optional assuming the object was moving before first interval 
find_stops = function(interval_movements,object.moving.at.t0=TRUE) { 
    intervals_to_search= c(object.moving.at.t0,interval_movements) 
    len = length(intervals_to_search) 
    #search for intervals with no movement where previous interval has movement 
    did.stop = sapply(2:len,function(i) all(intervals_to_search[(i-1):i] == c(T,F))) 
    return(did.stop) 
} 


#these intervals has no movement 
print(!find_interval_with_movement(xyz.matrix)) 

#these intervals had no movement, where previous had 
print(find_stops(find_interval_with_movement(xyz.matrix))) 

#and the full number of stops 
print(sum(find_stops(find_interval_with_movement(xyz.matrix)))) 
+0

Большое спасибо. Я впервые в R, я даже не слышал о некоторых функциях, которые вы упомянули. Я взял некоторые моменты из вашего кода, и они так полезны. Еще раз спасибо – Fornax

+0

В любом случае, это я не очень понимаю, почему вы это делаете: interval_with_movement =!apply (XYZ.m [-nrows,] == XYZ.m [-1,], 1, all) Не могли бы вы объяснить мне, что это значит? – Fornax

+0

Обязательная вещь :) XYZ.m - матричный ряд позиций и имеет 3 столбца оси XYZ. Подмножество -nrows или -1 означает удаление последней или первой строки XYZ.m, поэтому XYZ.m [-nrows,] == XYZ.m [-1,] дает новую матрицу строк nrows-1, где каждый элементы, если позиции по этой оси изменены. apply() - это функция цикла, которая здесь выполняет строковые операции. Выбранная операция all() выводит TRUE, если все элементы row.vector имеют значение TRUE. Поскольку all() выводит один элемент, apply будет выводить вектор, указав, были ли изменения в nrows-1 интервалах. ! negates и! all() то же самое, что и any() –

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