R sf::st_convex_hull()在具有多个组的数据上丢失了sf类

3
我正在尝试使用R中的sf包创建一个95%最小凸多边形。只要我只对一个变量分组,我的代码就能正常工作,但是当我对两个变量进行分组时,输出会失去其sf类并变成grouped_df。

这里是一个玩具数据集作为示例:

library(dplyr) 
set.seed(12)
toy <- tibble::tibble(
    ID = rep(c(1,2), each = 10),
    year = rep(c(1,2), 10),
    lat = runif(20, 1, 10),
    long = runif(20, 1, 10)
  ) %>%
    sf::st_as_sf(., coords = c("long", "lat")) 
toy %>%
  group_by(ID) %>% 
  summarize(.groups = "keep") %>% 
  mutate(cent = sf::st_centroid(geometry)) %>%
  sf::st_cast(to = "POINT") %>%  
  mutate(dist = sf::st_distance(geometry, cent, by_element = TRUE)) %>% 
  filter(dist <= quantile(dist, .95)) %>% 
  summarize()  %>%
  sf::st_convex_hull() %>%
  class()

这个代码可以输出我想要的结果。但是当我尝试按两个变量进行分组时,结果会丢失sf类。
toy %>%
  group_by(ID, year) %>% 
  summarize(.groups = "keep") %>% 
  mutate(cent = sf::st_centroid(geometry)) %>%
  sf::st_cast(to = "POINT") %>%  
  mutate(dist = sf::st_distance(geometry, cent, by_element = TRUE)) %>% 
  filter(dist <= quantile(dist, .95)) %>% 
  summarize()  %>%
  sf::st_convex_hull() %>%
  class

我的代码中是否有什么问题导致我无法按两个变量进行分组?

1个回答

1
这是因为第二个汇总正在ID上重新分组。您需要在那里添加 .groups = "keeps" 以通过相同的分组,然后将其转换回sf对象。或者,您可以创建一个分组变量 mutate(grp = paste0(ID,year)) 并执行 group_by(grp)
toy %>%
  group_by(ID, year) %>% 
  summarize(.groups = "keep") %>% 
  mutate(cent = sf::st_centroid(geometry)) %>%
  sf::st_cast(to = "POINT") %>%  
  mutate(dist = sf::st_distance(geometry, cent, by_element = TRUE)) %>% 
  filter(dist <= quantile(dist, .95)) %>% 
  summarize(.groups = "keep")  %>%
  sf::st_convex_hull() %>%
  st_sf()


谢谢!.groups = "keep" 在最后与 st_sf() 结合使用是有效的。但为什么它一开始就失去了 sf 类呢? - anna

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