使用非空间字段内连接两个sf对象

6

我试图使用内部连接或左连接来连接两个包含几何列的sf数据帧。然而,我一直收到以下错误信息:
Error in check_join(x, y) : y should be a data.frame; for spatial joins, use 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)。这取决于你想要完成的任务(可能是第一种选项)。 - Gilles San Martin
1个回答

10

如果您只想进行非空间连接但保留几何列,请先将它们“停用”(例如使用 as.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"

2
截至2021年初,现在还有一个内置的sf函数可以删除几何图形:st_drop_geometry(),因此不再需要依赖于as.data.frame()。[st_geometry() <- NULL也是一样的],这样就可以删除不需要的框架的几何图形,然后进行连接。这样我们就得到了一个名为“geom”的列,可以用作sf_column_name。 - Fitzroy Hogsflesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接