web-dev-qa-db-ja.com

データフレームを単純なフィーチャデータフレームにする方法は?

特定の座標参照系に場所参照とx座標およびy座標を含むテーブルがあります。それを単純な特徴データフレームに変えたいと思います。どうすればそれを作成できますか?

私はそれがそうかもしれないと思った:

data_frame(place = "London", 
           lat = 51.5074, lon = 0.1278, 
           epsg = 4326) %>%
  group_by(place) %>%
  mutate(feature = st_point(c(lon, lat)))

しかし、それはエラーにつながります:

Mutate_impl(.data、dots)のエラー:列featureは2ではなく長さ1(グループサイズ)である必要があります

これはおそらく非常に簡単に実行できます。ドキュメントで簡単に説明されていないだけです。ほとんどの空間アナリストは、デフォルトでより良いデータを要求しているようです:)。

私も試してみようと思いました:

data_frame(place = "London", 
           lat = 51.5074, lon = 0.1278, 
           epsg = 4326) %>%
  group_by(place) %>%
  do(with(., {
    p <- st_point(c(lon, lat))
    pcol <- st_as_sfc(p)
    st_as_sf(data_frame(place = place,
                        point = pcol),
             crs = epsg)
  }))

パイプの最後に、他の方法と同じようにプロットおよび操作できる単純なフィーチャデータフレームが必要です。

私がやろうとしていることのもう1つの摩擦は、EPSGの列を持つデータフレームがあることです。場所ごとにこの単純な特徴データフレームを作成し、それらをすべて組み合わせて、より大きな単純な特徴データフレームにする必要があります。

7
wdkrnls

更新@FranzPlumptonからの回答は、単一のepsgの正しい正しい解決策です。以下の私の答えは、data.frameの各行に異なるepsgがあるの場合にのみ必要です。そうでなければ、これは重複するでしょう(上記の@Henrikによって指摘されたように)。

library(sf)
library(tibble)

df <- data_frame(place = c("London", "Kalamazoo"), 
           lat = c(51.5074, 396088), lon = c(0.1278, 5452158),
           epsg = c(4326, 32610))

l <- lapply(unique(df$place), function(x){
  df <- df[df$place == x,]
  epsg <- df$epsg[1]
  df  <-  st_as_sf(df, coords = c('lon', 'lat'), crs = epsg)
}) 

次に、すべてを同じepsgに変換し、単一のdata.frameに結合できます。

do.call(rbind, lapply(l, function(x) x <- st_transform(x, 4326)))
2
sebdalgarno

あなたの試みと受け入れられた答えは不必要に複雑で、ひどく混乱しています。 st_as_sf(ちなみに、古いspクラス(SpatialPolygonsDataFramesなど)からすべてのオブジェクトを簡単に移行することもできます):

df <- data.frame(place = "London", 
       lat = 51.5074, lon = 0.1278,
       population = 8500000) # just to add some value that is plotable
projcrs <- "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"
df <- st_as_sf(x = df,                         
           coords = c("lon", "lat"),
           crs = projcrs)

そして、それと同じくらい簡単に完了です。

それを視覚化するためだけに:

library(tmap)
data("World")    
tm_shape(World[World$iso_a3 == "GBR", ]) + tm_polygons("pop_est") + 
    tm_shape(df) + tm_bubbles("population")

tmap way

または新しい驚くべきgeom_sf ggplot2から:

library(ggplot2)
ggplot(World) + geom_sf() + geom_sf(data = df, shape = 4, col = "red", size = 5)

ggplot2 way

17