根据 R 中的两个顺序变量分配 clusters/groups
Assigning clusters/groups based on two sequential variables in R
Context:我有一些空间点数据(即lon/lat坐标),每个点都与一个日期相关联。我已经将靠近的点聚类在一起,但我现在想将这些聚类分成几组,这样如果按日期排序,这些聚类是顺序的并分组在一起。日期可以有差距,我只想在观察完全划分一组时切分,即它不只是在边缘
基本上,给定下面的 cluster
和 day
字段我想生成 desired
.
cluster day desired
1 1 1 1
2 1 1 1
3 1 2 1
4 1 4 1
5 2 6 2
6 2 7 2
7 2 8 2
8 1 8 3
9 3 9 4
10 3 12 4
11 3 12 4
12 2 12 5
13 2 14 5
14 3 18 6
15 3 19 6
这是一个完整的示例,请注意空间坐标基本上是无关紧要的,我只是为了完整性而将它们包括在内。此外,在我的实际数据集中,day
是一个日期对象,但为了简单起见,我使用了一个整数。
library(ggplot2)
pts <- data.frame(rbind(
cbind(lon = rnorm(5, 0, 0.1), lat = rnorm(5, 0, 0.1),
day = c(1, 1, 2, 4, 8)),
cbind(lon = rnorm(5, 1, 0.1), lat = rnorm(5, 1, 0.1),
day = c(6, 7, 8, 12, 14)),
cbind(lon = rnorm(5, 1, 0.1), lat = rnorm(5, 0, 0.1),
day = c(9, 12, 12, 18, 19))
))
hc <- hclust(dist(pts[c("lon", "lat")]))
pts$cluster <- cutree(hc, k = 3)
ggplot(pts) +
geom_text(aes(lat, lon, label = day, col = as.factor(cluster)))
我要的分组是这样的:
pts$desired <- c(1, 1, 1, 1, 3,
2, 2, 2, 5, 5,
4, 4, 4, 6, 6)
ggplot(pts) +
geom_text(aes(lat, lon, label = day, col = as.factor(desired)))
此解决方案由@docendodiscimus 在对原始问题的评论中提供。
library(dplyr)
pts <- pts %>%
arrange(day, desc(cluster)) %>%
mutate(new_cluster = cumsum(c(1L, diff(cluster) != 0)))
all.equal(pts$desired, pts$new_cluster)
Context:我有一些空间点数据(即lon/lat坐标),每个点都与一个日期相关联。我已经将靠近的点聚类在一起,但我现在想将这些聚类分成几组,这样如果按日期排序,这些聚类是顺序的并分组在一起。日期可以有差距,我只想在观察完全划分一组时切分,即它不只是在边缘
基本上,给定下面的 cluster
和 day
字段我想生成 desired
.
cluster day desired
1 1 1 1
2 1 1 1
3 1 2 1
4 1 4 1
5 2 6 2
6 2 7 2
7 2 8 2
8 1 8 3
9 3 9 4
10 3 12 4
11 3 12 4
12 2 12 5
13 2 14 5
14 3 18 6
15 3 19 6
这是一个完整的示例,请注意空间坐标基本上是无关紧要的,我只是为了完整性而将它们包括在内。此外,在我的实际数据集中,day
是一个日期对象,但为了简单起见,我使用了一个整数。
library(ggplot2)
pts <- data.frame(rbind(
cbind(lon = rnorm(5, 0, 0.1), lat = rnorm(5, 0, 0.1),
day = c(1, 1, 2, 4, 8)),
cbind(lon = rnorm(5, 1, 0.1), lat = rnorm(5, 1, 0.1),
day = c(6, 7, 8, 12, 14)),
cbind(lon = rnorm(5, 1, 0.1), lat = rnorm(5, 0, 0.1),
day = c(9, 12, 12, 18, 19))
))
hc <- hclust(dist(pts[c("lon", "lat")]))
pts$cluster <- cutree(hc, k = 3)
ggplot(pts) +
geom_text(aes(lat, lon, label = day, col = as.factor(cluster)))
我要的分组是这样的:
pts$desired <- c(1, 1, 1, 1, 3,
2, 2, 2, 5, 5,
4, 4, 4, 6, 6)
ggplot(pts) +
geom_text(aes(lat, lon, label = day, col = as.factor(desired)))
此解决方案由@docendodiscimus 在对原始问题的评论中提供。
library(dplyr)
pts <- pts %>%
arrange(day, desc(cluster)) %>%
mutate(new_cluster = cumsum(c(1L, diff(cluster) != 0)))
all.equal(pts$desired, pts$new_cluster)