2016-07-06 9 views
3

私は、各観測の緯度と経度の座標を含む3000以上のレコードを持つデータフレームを持っています。私は、座標の各セットから国と州または州を取得したいと思います。JSON出力をデータフレームに抽出する方法は?

私は部分的な解決策を持っているようですが、私はRで新生児です。JSON出力からの情報を元のデータセットにバインドできるデータフレームに抽出する方法を理解できません。

fromJSONによって作成されたネストされたリストをdata.frameに解析する方法は?

緯度、経度、国、州(カラム名)また

、空間情報は得ることの私の問題へのよりよい解決策:を具体的に、私のようなものを見て、新たなデータフレームをしたいと思います感謝!ここで

が私のコードです:

library(RDSTK) 
library(httr) 
library(rjson) 
Coords <- structure(list(Latitude = c(43.30528, 46.08333, 32.58333, 46.25833, 45.75, 46.25, 45.58333, 45.58333, 44.08333, 45.75), 
         Lontitude = c(-79.80306, -82.41667, -117.08333, -123.975, -85.75, -123.91667, -86.75, -86.75, -76.58333, -85.25 
             )), .Names = c("Latitude", "Longitude"), row.names = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L,9L, 10L), class = "data.frame") 

json_file <- fromJSON(coordinates2politics(Coords$Latitude, Coords$Longitude)) 
+1

[Parse JSON with R]の複製が可能です(http://stackoverflow.com/questions/2061897/parse-json-with-r) – alistaire

+0

@alistaire投稿を読んでいますが、それは私の問題を解決しません!申し訳ありませんが、前者の場合は、私が言ったように、私はJSONの出力とリストを扱うことに新しいです。 –

答えて

4

私は、ネストされたJSONリストを解析するにはR.

でJSONを解析するためjsonliteを使用することを好む、あなたはlapplyfromJSON通話を行うことができます。

jsonlite::fromJSONは、結果を簡略化しようとしています。しかし、JSONはネストされたデータ構造を扱うように設計されているので、リストのdata.frameが返されることが多いので、リストのどの要素を知り、それを抽出する必要があります。data.frame例えば

library(RDSTK) 
library(jsonlite) 

js <- coordinates2politics(Coords$Latitude, Coords$Longitude) 
lst <- lapply(js, jsonlite::fromJSON) 

lst[[1]]$politics 
#   type friendly_type      name code 
# 1  admin2  country      Canada can 
# 2  admin4   state     Ontario ca08 
# 3 constituency constituency   Hamilton Centre 35031 
# 4 constituency constituency     Burlington 35010 
# 5 constituency constituency Hamilton East-Stoney Creek 35032 

data.frameを取得するには、あなたが望む要素を抽出し、その後do.call(..., rbind)、または私の好みのいずれかで完全にそれを置くために、別のlapplyを構築することができdata.table::rbindlist(...)

であります
lst_result <- lapply(lst, function(x){ 
    df <- x$politics[[1]] 
    df$lat <- x$location$latitude 
    df$lon <- x$location$longitude 
    return(df) 
}) 

data.table::rbindlist(lst_result) 

#   type friendly_type         name     code  lat  lon 
# 1:  admin2  country        Canada     can 43.30528 -79.80306 
# 2:  admin4   state        Ontario     ca08 43.30528 -79.80306 
# 3: constituency constituency      Hamilton Centre     35031 43.30528 -79.80306 
# 4: constituency constituency       Burlington     35010 43.30528 -79.80306 
# 5: constituency constituency   Hamilton East-Stoney Creek     35032 43.30528 -79.80306 
# 6:  admin2  country        Canada     can 46.08333 -82.41667 
# 7:  admin4   state        Ontario     ca08 46.08333 -82.41667 

また、各緯度/経度の詳細については、GoogleのAPIをlibrary(googleway)(免責事項:私はgooglewayと書いておきます)を使用して、緯度/経度のジオコードを逆にすることもできます。このため

あなたはまた、Googleの2500の制限によって制限される有効なGoogle APIキー(あなたが支払わない限り、一日あたり2,500リクエストに制限されている)library(ggmap)

library(googleway) 

key <- "your_api_key" 

lst <- apply(Coords, 1, function(x){ 
    google_reverse_geocode(location = c(x["Latitude"], x["Longitude"]), 
          key = key) 
}) 

lst[[1]]$results$address_components 
# [[1]] 
#        long_name       short_name         types 
# 1 Burlington Bay James N. Allan Skyway Burlington Bay James N. Allan Skyway         route 
# 2       Burlington       Burlington     locality, political 
# 3   Halton Regional Municipality   Halton Regional Municipality administrative_area_level_2, political 
# 4        Ontario         ON administrative_area_level_1, political 
# 5        Canada         CA      country, political 
# 6         L7S         L7S  postal_code, postal_code_prefix 

あるいは同様に、必要があります。

library(ggmap) 

apply(Coords, 1, function(x){ 
    revgeocode(c(x["Longitude"], x["Latitude"])) 
}) 

# 1 
# "Burlington Bay James N. Allan Skyway, Burlington, ON L7S, Canada" 
# 2 
# "308 Brennan Harbour Rd, Spanish, ON P0P 2A0, Canada" 
# 3 
# "724 Harris Ave, San Diego, CA 92154, USA" 
# 4 
# "30 Cherry St, Chinook, WA 98614, USA" 
# 5 
# "St James Township, MI, USA" 
# 6 
# "US-101, Chinook, WA 98614, USA" 
# 7 
# "2413 II Rd, Garden, MI 49835, USA" 
# 8 
# "2413 II Rd, Garden, MI 49835, USA" 
# 9 
# "8925 S Shore Rd, Stella, ON K0H 2S0, Canada" 
# 10 
# "Charlevoix County, MI, USA" 
+0

私の質問は不明だと思います。私は、Lat、Long、Country、StateまたはProvinceを含むデータフレーム出力を希望します。 –

+0

@KeithLarson - ok - 私は自分の答えを更新しました – SymbolixAU

+0

ありがとう、私はこれがどこにあるのかを見ていますが、それでも私の頭を 'rbindlist'の周りで包み込み、データを整理する方法を選んだ。 –

1

json-listを抽出する必要があります。あなたは本当に、あなたの最初の座標からの結果を持っている:

sapply(json_file[[1]]$politics, "[[", 'name')[ # now pick correct names with logical 
     sapply(json_file[[1]]$politics, "[[", 'friendly_type') %in% c("country","state") ] 
[1] "Canada" "Ontario" 

関数は「ベクトル化」ではないと思わので、あなたがfromJSON(coordinates2politics(.,.)抽出して、すべての座標一つ一つを実行するためにapplyを使用している必要があります。

res=apply(Coords, 1, function(x) {fromJSON(coordinates2politics(x['Latitude'], 
                   x['Longitude']))}) 
sapply(res, function(x) sapply(x[[1]]$politics, "[[", 'name')[ 
          sapply(x[[1]]$politics, "[[", 'friendly_type') %in% 
                   c("country","state")]) 
$`1` 
[1] "Canada" "Ontario" 

$`2` 
[1] "Canada" "Ontario" 

$`3` 
[1] "United States" "California" "Mexico"  "California" 

$`4` 
[1] "United States" 

$`5` 
[1] "United States" "Michigan"  

$`6` 
[1] "United States" "Washington" 

$`7` 
[1] "United States" "Michigan"  

$`8` 
[1] "United States" "Michigan"  

$`9` 
[1] "Canada" "Ontario" 

$`10` 
[1] "United States" "Michigan" 

ボーダーの近くのアイテム(サンディエゴ郡やチュラヴィスタのようなもの)はあいまいな結果を表示します。

関連する問題