2016-07-10 2 views
0

나는 더 좋은 방법으로 문구를 쓰는 법을 모른다. 여기 내 문제가있다.벡터의 연속적인 행에 대한 연산이

같은 매우 간단한 데이터 프레임 무엇인가 - 이제

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 ((east-north)^2 + (lag (east) -lag (north))^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 = 0shift 호출에 추가했습니다. 이 값은 shift 기능을 수행 할 수없는 셀 (이 경우 행 1)의 값을 지정합니다. 이 값을 0으로 설정하면 "시작"지점을 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 
관련 문제