2016-10-25 12 views
0

にdplyrを使用してテーブル内の総距離を要約は、ユーザ、シーケンス、および地理的位置からなる:xおよびy計算及びIテーブルを持っているR

Iは、ユーザによるグループにしたいとに基づいて総距離を計算することになります例えば配列

:ここ

> df <- data.frame(user_id=rep(1,3), seq=1:3, x=c(1,5,3), y=c(2,3,9)) 
> df 
    user_id seq x y 
1  1 1 1 2 
2  1 2 5 3 
3  1 3 3 9 

2点(ユークリッド)距離を計算するための関数である:

> d <- function(n1,n2){ 
+ d <- sqrt((df$y[n2]-df$y[n1])^2+(df$x[n2]-df$x[n1])^2) 
+ return(d) 
+ } 

私はこのような総距離を取得したいと思います:

> df <- data.frame(user_id=1, dtot=d(1,2)+d(2,3)) 
> df 
    user_id dtot 
1  1 10.45 

は、どのように私は「GROUP_BY」dplyr使用して、すべてのユーザーの配列に基づいて総距離を得ることができますか?あなたが望むものを達成するために

+0

あなたの距離関数は、2つのエントリを受け取ります。どちらの点で計算すべきですか?シーケンスは軌道に沿ったポイントを表していますか? – Omri374

答えて

1

一つの方法は、総距離を計算する関数を定義することです。この関数の

library(dplyr) 
total.dist <- function(x,y) { 
    sum(sqrt((x-lag(x))^2+(y-lag(y))^2),na.rm=TRUE) 
} 

入力が列ベクトルxyです。これらの列のlagで減算することによって、各行間の距離をベクトル化して計算します。次に、合計距離は、計算されたすべての距離のうちsumであり、NAを除いて計算されます。

その後summarise機能group_byuser_idとしてこれを使用して:

res <- df %>% group_by(user_id) %>% summarise(dtot=total.dist(x,y)) 
### A tibble: 1 x 2 
## user_id  dtot 
## <dbl> <dbl> 
##1  1 10.44766 
関連する問題