我正在尝试使用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是不是我的代码中有什么东西让我无法对两个变量进行分组?
发布于 2020-11-16 11:27:27
这是因为第二个汇总是对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()

https://stackoverflow.com/questions/64851071
复制相似问题