2016-07-12 9 views
0

私は182のフォルダに182というユーザーのフォルダ名で '000'、 '001'、 '002' ..... '181'などのgps軌跡データを持っています。各フォルダの中には、 "Trajectories"という名前の別のフォルダがあり、多くの.pltファイルが含まれています。各ファイルは、このユーザーが記録した1つの軌跡を示します。ここで.PLTファイルの例です:gpsトラジェクトリーデータin r

lat,lon,default,altitude,num of days,date,time 
39.921712,116.472343,0,13,39298.1462037037,2007-08-04,03:30:32 
39.921705,116.472343,0,13,39298.1462152778,2007-08-04,03:30:33 
39.921695,116.472345,0,13,39298.1462268519,2007-08-04,03:30:34 
39.921683,116.472342,0,13,39298.1462384259,2007-08-04,03:30:35 
39.921672,116.472342,0,13,39298.14625,2007-08-04,03:30:36 
39.921583,116.472315,0,13,39298.1462731481,2007-08-04,03:30:38 
39.921572,116.472315,0,13,39298.1462847222,2007-08-04,03:30:39 
39.92156,116.47229,0,13,39298.1462962963,2007-08-04,03:30:40 
39.921565,116.47229,0,13,39298.1463078704,2007-08-04,03:30:41 
39.92157,116.472288,0,13,39298.1463194444,2007-08-04,03:30:42 
39.921577,116.4723,0,13,39298.1463310185,2007-08-04,03:30:43 
39.92158,116.472307,0,13,39298.1463425926,2007-08-04,03:30:44 
39.921562,116.472303,0,13,39298.1463541667,2007-08-04,03:30:45 
39.921545,116.472308,0,13,39298.1463657407,2007-08-04,03:30:46 
39.921532,116.472313,0,13,39298.1463773148,2007-08-04,03:30:47 
39.921505,116.472317,0,13,39298.146400463,2007-08-04,03:30:49 
39.921492,116.472317,0,13,39298.146412037,2007-08-04,03:30:50 
39.921485,116.472323,0,13,39298.1464351852,2007-08-04,03:30:52 
39.921487,116.472323,0,13,39298.1464930556,2007-08-04,03:30:57 
39.921487,116.472318,0,13,39298.1465046296,2007-08-04,03:30:58 

今私は何をしたいことは、平均距離を計算することで、各ユーザーは、私は、ユーザーフォルダ内の各.PLTファイルの距離を計算する必要があることを意味カバーを、持っていますpltファイルのnumで割って平均距離を取得します。

私はRで本当に新しいだと私はちょうどこのようなコードのビットを書く:

dir <- "Geolife Trajectories 1.3/Data" 
subdirs <- list.files(dir) 
numbersubdirs <- setdiff(subdirs) 
df <- NULL 
for(i in 1:length(numbersubdirs)) { 
    path <- paste0(dir,"/",numbersubdirs[i],"/Trajectory") 
    pltfiles <- list.files(path) 
    for(j in pltfiles) { 
    pltpath <- paste0(path,"/",j) 
    data <- read.table(pltpath, skip = 6, header = FALSE, sep =",",stringsAsFactors = FALSE) 

私は本当にこのループを終了するか見当がつかない...誰かが私にここにいくつかの助けを与えることができますか? ?どうもありがとう!あなたはせずに、同様の結果を得ることができるが、各GPSとの距離は、座標計算するには

+0

このようなものに適したいくつかの旅行/軌道パッケージがあります。 – mdsumner

+0

@mdsumner trajectoriesというパッケージが見つかりましたが、私と同じデータフォーマットでは動作しませんでした。私はすべてのデータをtxtフォーマットにまとめて転送しましたが、基本的な機能(data())はまだ動作しません。 –

答えて

0

gps_distance <- function(lat, lon) { 
    len <- length(lat) 
    earth.radius <- 6.371 * 10^6 # m 

    # Convert degrees to radians 
    latrad <- lat * pi/180 # rad 
    lonrad <- lon * pi/180 # rad 

    dlat <- latrad[2:len] - latrad[1:(len-1)] 
    dlon <- lonrad[2:len] - lonrad[1:(len-1)] 

    a <- sin(dlat/2)^2 + sin(dlon/2)^2 * cos(latrad[1:(len-1)]) * cos(latrad[2:len]) 
    c <- 2 * atan2(sqrt(a), sqrt(1-a)) 
    d <- c(NA, c) 

    # Return in meters 
    d * earth.radius 
} 

dplyrパッケージには、符号化ビットを簡素化します。あなたの例は簡単には再現できませんが、次の行に沿って何かが働くはずです。

library(dplyr) 
data_path <- "Geolife Trajectories 1.3/Data" 
users  <- dir(data_path, full.names = T) 

lapply(users, data_path = data_path, gps_distance = gps_distance, 
     # Applies this function for each user 
     function(user, data_path, gps_distance) { 
     # Find all .plt files in their 'Trajectory' directory 
     file.path(data_path, 'Trajectory') %>% 
      dir(pattern = '.*\\.plt', full.names = T) %>% 
      lapply(function(file) { 
      # then read in and return the total_distance in each file 
      read.csv(file, stringsAsFactors = F) %>% 
       mutate(distance = gps_distance(lat, lon)) %>% 
       summarize(total_distance = sum(distance, na.rm = T)) 
      }) %>% 
      # then calculate the average distance that each user traveled 
      # with their trajectories 
      bind_rows() %>% 
      summarize(avg_distance = mean(total_distance, na.rm = T)) 
     })