2017-01-13 10 views
1

にデータフレームに例を追加:緯度/ long型から関数からの戻り複数のベクターと

library(tidyverse) 
library(ggmap) 

latLong <- data.frame(long= c(78.0422, -0.1246, 131.035904, 122.3493), 
        lat = c(27.1750, 51.5007, -25.344646, 47.6205), 
        name = c("Taj Mahal", "Big Ben", "Uluru", "Space Needle")) 

アドレスの詳細は逆ジオコード検索によって発見されました。 この関数はデータフレームを返します。

results <- revgeocode(c(78.0422, 27.1750), output = "more") 

我々は、データフレームに結果 バックを書き、 緯度及び経度を含むベクターに関数を適用することによって、結果 の任意の大きなセットを返したいです。

単一の値を戻したい場合は、mapplyを使用できます。

getLocality <- function(long, lat) { 
    locality <- revgeocode(c(long, lat), output = "more") 
    locality <- locality$locality 
    return(locality) 
} 

localities <- mapply(getLocality, latLong$long, latLong$lat) 

私たちは、新しい列としてデータフレーム に値を返す関数を使用することができます。

latLong$locality <- mapply(getLocality, latLong$long, latLong$lat) 

また、dplyrを使用することもできます。

latLong <- latLong %>% 
    rowwise() %>% 
    mutate(dplyrLocality = getLocality(long, lat)) 

これまでに出力さ:

|long |lat  |name  |locality  |dplyrLocality | 
|--------|---------|------------|--------------|--------------| 
|78.0422 |27.17500 |Taj Mahal |Agra   |Agra   | 
|-0.1246 |51.50070 |Big Ben  |London  |London  | 
|131.0359|-25.34465|Uluru  |Petermann  |Petermann  | 
|122.3493|47.62050 |Space Needle|Hulunbeier Shi|Hulunbeier Shi| 

私たちはに戻って、結果セットのすべてのを書きたい場合は?

getAddress <- function(long, lat) { 
    address <- revgeocode(c(long, lat), output = "more") 
    return(address) 
} 

はクリーン/最も効率的な/最も簡単には戻って、複数の新しい列として LatLongブログのデータフレームにデータフレーム全体を書き込むための方法を理解することは何ですか?あなたはそれを行うためのいくつかの代替方法を与えることができますか、おそらく適用家族を使用するものと、dplyrを使用するものがありますか?

+0

あなたが '' 'のgetAddress(122.3493、47.62050)を通じて'のgetAddress(78.0422、27.17500)によって返された情報のすべてを含む 'data.frame'を作成しますか問題は、最初の要素が10個の要素を返し、最後の要素が6個の要素しか返さないということですか? –

+0

希望の結果が 'historical_sites'という名前のSQLのテーブルとして想像され、各タプルがユニークなキー(longとlatのコンポジット)で構成されている場合、名前、住所、通り、地域、地域、国、そのような歴史的なサイトのように。したがって、各行は単一のサイトを表し、各列は地理属性になります。それは結果がどのように見えるかについてのアイデアを提供しますか?私は 'by(latLong、1:nrow(latLong)、function(x){})と' dplyr'と 'mapply'を含むいくつかの異なる方法を試しました。シングルバリューのみで働いた。 –

答えて

2

purrrパッケージで簡単にできると思います。 map2_df()は2つの引数を取り、data.frameを返します。

library(purrr) 

df <- data.frame(latLong,map2_df(latLong$long,latLong$lat,getAddress)) 

str(df) 
'data.frame': 4 obs. of 15 variables: 
$ long      : num 78.042 -0.125 131.036 122.349 
$ lat      : num 27.2 51.5 -25.3 47.6 
$ name      : Factor w/ 4 levels "Big Ben","Space Needle",..: 3 1 4 2 
$ address     : chr "Dashehara Ghat Rd, Dharmapuri, Forest Colony, Tajganj, Agra, Uttar Pradesh 282006, India" "Palace of Westminster, Westminster, London SW1A 2PW, UK" "Uluru Rd, Petermann NT 0872, Australia" "Unnamed Road, Zhalantun Shi, Hulunbeier Shi, Neimenggu Zizhiqu, China" 
$ route      : chr "Dashehara Ghat Road" NA "Uluru Road" "Unnamed Road" 
$ neighborhood    : chr "Dharmapuri" "Westminster" NA NA 
$ political     : chr "Tajganj" NA NA "Zhalantun Shi" 
$ locality     : chr "Agra" "London" "Petermann" "Hulunbeier Shi" 
$ administrative_area_level_2: chr "Agra" "Greater London" "Macdonnell Shire" NA 
$ administrative_area_level_1: chr "Uttar Pradesh" "England" "Northern Territory" "Neimenggu Zizhiqu" 
$ country     : chr "India" "United Kingdom" "Australia" "China" 
$ postal_code    : chr "282006" "SW1A 2PW" "0872" NA 
$ establishment    : Factor w/ 1 level "Palace of Westminster": NA 1 NA NA 
$ postal_town    : Factor w/ 1 level "London": NA 1 NA NA 
+0

うわー、それは本当にクールです。私はスペースニードルの緯度/経度を台無しにしたと思う;)ありがとう、私はドキュメントを見てみよう! Upvoted。 –

+0

それは素晴らしいです。 'dplyr'のようにパイプ演算子を使うこともできます。 'latLong%>%map2_df(。$ long、。$ lat、getAddress)のようなもの' –