4

ラスター パッケージの getData 関数を使用して、アルゼンチンの地図を取得しています。ggplot2 を使用して結果のマップをプロットしたいので、broom パッケージの tidy 関数を使用してデータフレームに変換しています。これは問題なく動作しますが、連邦区の名前を保存して地図上で使用できるようにする方法がわかりません。

地区名を保持しない元のコードは次のとおりです。

# Original code: ##################################
# get the map data from GADM.org and then simplify it
arg_map_1 <- raster::getData(country = "ARG", level = 1, path = "./data/")     %>% 
  # simplify
  rmapshaper::ms_simplify(keep = 0.01) %>% 
  # tidy to a dataframe
  broom::tidy()

# plot the map
library(ggplot2)
ggplot(data=arg_map_1) +
  geom_map(map=arg_map_1, aes(x=long, y=lat, map_id=id, fill=id),
       color="#000000", size=0.25)

そして、SPDF から地区名を取り出してマップ ID として使用するためのハックを含むコードを次に示します。

# Code with a hack to keep the district names: ################################
# get the map data from GADM.org and then simplify it
arg_map_1 <- raster::getData(country = "ARG", level = 1, path = "./data/") %>% 
  # simplify
  rmapshaper::ms_simplify(keep = 0.01)  

for(region_looper in seq_along(arg_map_1@data$NAME_1)){
  arg_map_1@polygons[[region_looper]]@ID <- 
    as.character(arg_map_1@data$NAME_1[region_looper]) 
}

# tidy to a dataframe
arg_map_1 <- arg_map_1 %>% 
  broom::tidy()

library(ggplot2)
ggplot(data=arg_map_1) +
  geom_map(map=arg_map_1, aes(x=long, y=lat, map_id=id, fill=id),
           color="#000000", size=0.25)

名前を保持するtidy関数を使用する方法があるに違いないと考え続けていますが、私の人生では、それを理解することはできません.

4

2 に答える 2

7

joinパッケージの関数を使用できますplyr。一般的な解決策は次のとおりです (長く見えますが、実際には非常に簡単です)。

  1. Load shapefile :my_shapefile.shp作業ディレクトリにシェープファイルがあるとします。ロードしましょう:

    shape <- readOGR(dsn = "/my_working_directory", layer = "my_shapefile")
    

    このシェープファイル内には、 でアクセスできるデータフレームがあることに注意してshape@dataください。たとえば、このデータフレームは次のようになります。

    > head(shape@data)
           code                   region     label
    0 E12000006          East of England E12000006
    1 E12000007                   London E12000007
    2 E12000002               North West E12000002
    3 E12000001               North East E12000001
    4 E12000004            East Midlands E12000004
    5 E12000003 Yorkshire and The Humber E12000003
    
  2. シェープファイルから新しいデータフレームを作成する: パッケージを使用してbroom、シェープファイル データフレームを調整します。

    new_df <- tidy(shape)
    

これにより、次のような結果になります。

> head(new_df)
      long      lat order  hole piece group id           
1 547491.0 193549.0     1 FALSE     1   0.1  0 
2 547472.1 193465.5     2 FALSE     1   0.1  0 
3 547458.6 193458.2     3 FALSE     1   0.1  0 
4 547455.6 193456.7     4 FALSE     1   0.1  0 
5 547451.2 193454.3     5 FALSE     1   0.1  0 
6 547447.5 193451.4     6 FALSE     1   0.1  0

残念ながら、tidy()変数名 (この例では「地域」) が失われています。代わりに、0 から始まる新しい変数「id」を取得しました。幸いなことに、「id」の順序は に格納されている順序と同じshape@data$regionです。これを使って名前を復元しましょう。

  1. 行名で補助データフレームを作成: 行名で新しいデータフレームを作成しましょう。tidy()さらに、作成したものと同じ「id」変数を追加します。

    # Recover row name 
    temp_df <- data.frame(shape@data$region)
    names(temp_df) <- c("region")
    # Create and append "id"
    temp_df$id <- seq(0,nrow(temp_df)-1)
    
  2. 「id」を使用して行名を新しいデータフレームとマージします。最後に、名前を新しいデータフレームに戻します。

    new_df <- join(new_df, temp_df, by="id")
    

それでおしまい!joinコマンドと「id」インデックスを使用して、新しいデータフレームにさらに変数を追加することもできます。最終結果は次のようになります。

> head(new_df)
      long      lat order  hole piece group id            name    var1    var2 
1 547491.0 193549.0     1 FALSE     1   0.1  0 East of England   0.525   0.333   
2 547472.1 193465.5     2 FALSE     1   0.1  0 East of England   0.525   0.333   
3 547458.6 193458.2     3 FALSE     1   0.1  0 East of England   0.525   0.333   
4 547455.6 193456.7     4 FALSE     1   0.1  0 East of England   0.525   0.333   
5 547451.2 193454.3     5 FALSE     1   0.1  0 East of England   0.525   0.333   
6 547447.5 193451.4     6 FALSE     1   0.1  0 East of England   0.525   0.333   
于 2017-05-15T12:25:54.710 に答える