2016-07-10 3 views
0

Я не знаю, как правильно это сформулировать. Вот моя проблема.операции с последовательными строками вектора в R

очень простой кадр данных что-то вроде -

df= {"time" "east" "north" 
     1  0  0 
     2  2  0 
     3  1  0 
     4  1  2 
    } 

Теперь, я хотел бы добавить расстояния (в качестве другого столбца) между двумя последовательными кадрами времени (за исключением первой строки). Например, например, в time==2 расстояние должно быть рассчитано как sqrt((2-0)*(2-0) + (0-0)*(0-0)). , Вероятно, результат может быть что-то вроде этого

df= {"time" "east" "north" "distance" 
     1  0  0   0 
     2  2  0   2 
     3  1  0   1 
     4  1  2   2 
    } 

Естественно, я хотел бы иметь метод, чтобы получить расстояние, которое принимает на восток и на север от двух последовательных строк и возвращает евклидово расстояние между точками. 1) Как достичь расстояния между двумя последовательными точками в кадре данных?

Я хочу применить аналогичные операции или настраиваемые функции (расстояние, последовательное вычитание и т. Д.) Для подмножеств огромных кадров данных. В конце я хотел бы построить сегменты, например.

index = length(df$time)-1 
segments(df$time[index],df$time[index+1], df$distance[index], df$distance[index+1]) 

2) Есть ли лучший способ построить сегменты из последовательных точек? Указатель на что-то подобное также будет очень полезен.

+1

Не ясно, что вам нужно. Возможно, если вы включите ожидаемый результат ... – Sotos

+0

спасибо, я добавил также выход. – novice

+0

, основанный на вашей оценке, 'с (df, sqrt ((восток-север)^2 + (лаг (восток) -лаг (север))^2))', тогда значения будут разными. – akrun

ответ

4
library(data.table) 
setDT(df)[ , distance := sqrt((east - shift(east, 1, type = "lag", fill = 0))^2 + 
         (north - shift(north, 1, type = "lag", fill = 0))^2) ] 

Должно получиться, что вы после. Функция shift принимает смещение значения на заданное количество строк. lag означает, что он будет смотреть вверх (lead будет смотреть вниз).

Я также добавил fill = 0 на номера shift. Это указывает значение для ячеек, где функция shift не может быть выполнена (в данном случае строка 1). Делая этот ноль, вы фактически указываете «начальную» точку 0, поэтому даже первая строка может иметь расстояние, она будет только от нулевой точки, а не от всех ячеек над ней.

+0

Думаю, я могу сделать то же самое для других операций. Благодарю. – novice

2

Мы можем использовать dplyr

library(dplyr) 
df %>% 
    mutate(distance = sqrt((east - lag(east, default = 0))^2 + 
        (north - lag(north, default = 0))^2)) 
# time east north distance 
#1 1 0  0  0 
#2 2 2  0  2 
#3 3 1  0  1 
#4 4 1  2  2 
Смежные вопросы