2016-04-02 7 views
0

Rのgpxトラックを分析したいのですが、データをインポートするために、私はXML-packageを使用しようとしています。XMLライブラリを使用してgpxトラックをインポート

個々のデータベクトルをインポートしてデータフレームに結合する方法を説明したa tutorialが見つかりました。

しかし、いくつかのノードでは心拍数がないので、私の使用状況では機能しません。<gpxtpx:hr>が収集されているため、ベクトルの長さが一致しません。

したがって、関連するすべてのデータを一度にインポートしようとしています。

私はこれまでやって管理することの代わりにルートノードの、私はデータフレームに<trkseg>のコンテンツをインポートしたいのですが、今

library(XML) 

filename <- "sample.gpx" 
download.file("https://owncloud.yeara.net/index.php/s/Io4uOq6sfFuCCdq/download", filename) # downloads a sample file from my server 

gpx.raw <- xmlTreeParse(filename, useInternalNodes = TRUE) 

rootNode <- xmlRoot(gpx.raw) 

print(rootNode) # output seems okay 

です。それは次のように設計すべきである:各trkseg

  • trkpt lonでなければなりません

    • trkpt lat<ele><time>は値<gpxtpx:hr>がある場合、それはまたに入る必要があり、対応する列
    • にする必要があります対応する列

    これを達成するのを手伝ってもらえますか?

  • +0

    あなたはこの処理を行うため、これまであなたが持っているコードを表示することができますか?適切なノードを処理する関数を作成するだけで、 "hr"子が存在しないときのデフォルトを提供できますか? – steveb

    +0

    私がこれまで使っていたコードは、私の質問でリンクされています:http://www.r-bloggers.com/stay-on-track-plotting-gps-tracks-with-r/または 'elevations < - as.numeric xpathSApply(gpx.raw、path = "// trkpt/ele"、xmlValue)) '(同様の)。しかし、これは常に列を1つずつインポートするため、これは非常にエレガントではありません。 gpxファイルの構造から、(少なくとも理論的には)すべての関連データを一度にインポートすることが可能です。これが不可能な場合は、欠落している 'hr'ノードを全て 'NA'に置き換える方法があるかもしれません。 – speendo

    +1

    ネストされたxmlファイルを平坦化することは(imho)常に苦痛です。 ststを 'lst lukeA

    答えて

    0

    これは私が結んだコードです。助けを借りて皆様(特に@lukeA)に感謝します。

    library(XML) 
    library(plyr) 
    
    filename <- "Downloads/activity(1).gpx" 
    
    gpx.raw <- xmlTreeParse(filename, useInternalNodes = TRUE) 
    
    rootNode <- xmlRoot(gpx.raw) 
    
    gpx.rawlist <- xmlToList(rootNode)$trk 
    
    gpx.list <- unlist(gpx.rawlist[names(gpx.rawlist) == "trkseg"], recursive = FALSE) 
    
    gpx <- do.call(rbind.fill, lapply(gpx.list, function(x) as.data.frame(t(unlist(x)), stringsAsFactors=F))) 
    names(gpx) <- c("ele", "time", "hr", "lon", "lat") 
    

    (それらはすべて、リストに同じ名前を持っているので:trksegを)私は名前でそれらにアクセスすることができなかったように私は、複数のtrkseg sのいくつかの問題を持っていた私はunlistコマンドとのトリッキーな選択でこれを解決できますgpx.rawlistの要素。

    もっとエレガントな方法があるのだろうかと思うが、少なくともこれはうまくいくようだ。ここで

    0

    はpurrr @speendoからの回答に似たものですが、dplyrを使用して:

    library(XML) 
    library(dplyr) 
    library(purrr) 
    
    filename <- "Downloads/activity(1).gpx" 
    
    gpx <- filename %>% 
        xmlTreeParse(useInternalNodes = TRUE) %>% 
        xmlRoot %>% 
        xmlToList %>% 
        (function(x) x$trk) %>% 
        (function(x) unlist(x[names(x) == "trkseg"], recursive = FALSE)) %>% 
        map_df(function(x) as.data.frame(t(unlist(x)), stringsAsFactors=FALSE)) 
    
    関連する問題