使用dplyr中的distinct函数在R中忽略sf对象的几何形状。

4
我有一个包含多个不同位置的多边形数据集,它们共享相同的属性。对于每组唯一属性(在下面的示例中是 AreaZone),我只想要一个多边形,而不关心它们所在的位置,因此我想忽略几何属性。
library(sf)
library(dplyr)

    Areas <- st_as_sf(tibble(
      Area =c("Zone1", "Zone1","Zone2","Zone1"),
      Zone =c("Area27","Area27","Area42","Area27"),
      lng = c(20.1, 20.2, 20.1, 20.1),
      lat = c(-1.1, -1.2, -1.1, -1.1)),
    coords = c("lng", "lat")) %>% st_buffer(.,100)

我正在使用dplyr的distinct函数来去除重复记录,但是我发现它在确定不同的记录时正在使用几何列,尽管我认为它应该忽略几何列:

Areas %>% distinct(across(-geometry),.keep_all=TRUE)

然而,当几何形状不同时,它会返回Zone1和Area27的两个结果。 这是预期行为还是我做错了什么?
我的要求输出中只有两行,一行为Zone1和Area27,另一行为Zone2和Area42,并保留这些行的几何形状,即类似于在普通tibble上运行相同代码时发生的情况。
Table <- tibble(
  Area =c("Zone1", "Zone1","Zone2","Zone1"),
  Zone =c("Area27","Area27","Area42","Area27"),
  lng = c(20.1, 20.2, 20.1, 20.1),
  lat = c(-1.1, -1.2, -1.1, -1.1))

Table %>% distinct(across(c(-lng,-lat)),.keep_all=TRUE)  
2个回答

2
我发现了一种替代方法:
Areas %>% group_by(Area,Zone) %>% 
          mutate(id = row_number()) %>% 
          filter(id == 1) %>% 
          select(-id)

如果你处理的数据集有很多多边形,这种方法可能比@Waldi的答案更快(至少对我来说是这样)。


0
你可以总结一下:
Areas  %>% group_by(Area,Zone) %>% summarize()

# A tibble: 2 x 3
# Groups:   Area [2]
  Area  Zone                                                                          geometry
  <chr> <chr>                                                                        <POLYGON>
1 Zone1 Area27 ((120.2 -1.2, 120.063 -6.433596, 119.6522 -11.65285, 118.9688 -16.84345, 118.0~
2 Zone2 Area42 ((120.1 -1.1, 119.963 -6.333596, 119.5522 -11.55285, 118.8688 -16.74345, 117.9~


那是一个选项。然而(我在原问题中没有表述清楚),我需要保持几何形状,因为在这一点之后,我还有其他空间操作要对数据进行。 - Chris
我的编辑中的另一个选项是否满足您的需求?由于存在两种不同的几何形状,很难区分,您需要在此管道中至少丢失几何信息,或者进行group_by并保留第一个几何值。 - Waldi
很遗憾,我原以为 'distinct(across(-geometry)' 在查找不同的要素时会忽略几何字段。但实际上它并没有这样做,唯一的解决方案似乎是删除几何字段(这并不是期望的结果)。在我的看法中,这似乎不太对,因为相同的代码在普通的 tibble 上可以正常工作(请参见我在问题中添加的另一个示例)。 - Chris
好的,我明白了,看我的编辑:保留几何图形,这是你要找的吗? - Waldi
是的,谢谢你。看起来distinct不能胜任这项工作,但事实就是如此! - Chris
几何是一个 sf 类,它似乎不完全像标准数据框列一样运作... - Waldi

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