【问题标题】:Inner-Joining two sf objects by non sf column通过非 sf 列内连接两个 sf 对象
【发布时间】:2018-08-08 11:45:15
【问题描述】:

我正在尝试使用内连接或左连接来连接两个 sf 数据帧。这些数据框内部都有几何列。我不断收到错误:
check_join(x, y) 中的错误: y 应该是一个data.frame;对于空间连接,使用 st_joinFALSE

下面的可重现示例:

df1 <- data.frame(
  var = c("a", "b", "c"),
  lon1 = c(20,35,45),
  lat1 = c(50,10,15)
) %>% st_as_sf(coords = c("lon1", "lat1"), dim = "XY") %>%
  st_set_crs(4326)

df2 <- data.frame(
  var = c("a", "b", "c"),
  lon2 = c(15,25,35),
  lat2 = c(5,10,15)
) %>% st_as_sf(coords = c("lon2", "lat2"), dim = "XY") %>%
  st_set_crs(4326)

df <- inner_join(df1, df2, by = "var")

我不想放弃几何,因为我认为这可能会弄乱我的结果,但欢迎任何解决方案

【问题讨论】:

  • 你的例子没有意义。 df1 和 df2 严格相同。要么你想加入属性表,然后你可以删除一个数据集的几何图形,要么你想按位置合并,然后你需要使用st_join,如错误消息中所述。另一种可能性是在几何之间创建交集 (st_intersection)。这取决于您想要做什么(可能是第一个选项)

标签: r join geometry gis sf


【解决方案1】:

如果您只想进行非空间连接但将几何列向前移动,您可以先“停用”它们(例如 as.data.frame()),连接,然后“重新激活”您创建的几何列想要活跃。现在,您的 data.frame 中有两个 sfc 列,但“geometry.x”是活动列。

df <- inner_join(df1 %>% as.data.frame(), df2 %>% as.data.frame(), by = "var")

df %<>% st_sf(sf_column_name = 'geometry.x')

> str(df)
Classes ‘sf’ and 'data.frame':  3 obs. of  3 variables:
 $ var       : Factor w/ 3 levels "a","b","c": 1 2 3
 $ geometry.x:sfc_POINT of length 3; first list element: Classes 'XY', 'POINT', 'sfg'  num [1:2] 20 50
 $ geometry.y:sfc_POINT of length 3; first list element: Classes 'XY', 'POINT', 'sfg'  num [1:2] 15 5
 - attr(*, "sf_column")= chr "geometry.x"
 - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA
  ..- attr(*, "names")= chr  "var" "geometry.y"

> st_crs(df)
    Coordinate Reference System:
      EPSG: 4326 
      proj4string: "+proj=longlat +datum=WGS84 +no_defs"

【讨论】:

  • 从 2021 年初开始,现在还有一个内置的 sf 函数来删除几何图形:st_drop_geometry(),因此不必再依赖 as.data.frame()。 [st_geometry()
猜你喜欢
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 2020-02-04
相关资源
最近更新 更多