【问题标题】:Assigning clusters/groups based on two sequential variables in R基于 R 中的两个顺序变量分配集群/组
【发布时间】:2016-05-23 23:46:30
【问题描述】:

上下文:我有一些空间点数据(即经纬度坐标),每个点都与一个日期相关联。我已经将靠近的点聚集在一起,但我现在想将这些集群分成组,以便如果按日期排序,这些集群是连续的并组合在一起。日期可以有间隔,我只想在观察完全划分一组时进行分割,即它不仅仅是在边缘

基本上,鉴于下面的clusterday 字段,我想生成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)))

【问题讨论】:

  • 澄清一下,您的问题是“如何填充desired”还是其他问题?
  • 是的,如何创建desired 列?抱歉,我现在意识到这个问题有点令人困惑
  • 是的,找到进行剪辑的位置,然后根据这些剪辑分配组。看我刚刚发布的解决方案,我认为解决了问题,但不是很优雅
  • 看起来“期望”总是随着列“cluster”的每次变化而增加。在这种情况下,您可以使用cumsum(c(1L, diff(df$cluster) != 0)) 创建它。
  • @docendodiscimus 既然您想出了设置desired 的方法,也许您想发布完整的答案(即获得信用)。对于 dplyr 和您的建议,它可能看起来像 pts %&gt;% arrange(day, cluster) %&gt;% mutate(desired = cumsum(c(1L, diff(cluster) != 0)))

标签: r cluster-analysis dplyr


【解决方案1】:

此解决方案由原始问题的 cmets 中的@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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2017-01-10
    相关资源
    最近更新 更多