首页 > 解决方案 > 根据常见日期创建组变量

问题描述

我有一个包含动物 ID 和日期的大型数据集。这个数据集中有两个组,但没有分组变量,所以我必须根据他们似乎有共同的日期推断谁属于哪个组。

虚拟数据。

mydf<-data.frame( Date=sort(rep(seq(as.Date("2012/1/1"),as.Date("2012/1/4"), length.out = 4),5)), ID = c(1,2,3,4,5,5,6,7,8,9,1,2,3,4,5,6,7,8,9,10))

我遇到的另一个问题是,属于第 1 组的 ID 时不时会出现与第 2 组关联的日期,这是迄今为止我在分组时所做的每一次尝试都失败的原因。

我需要的是一个带有 ID 的输出和一个像这样的新组 ID

ID Group
1     1
2     1
3     1
4     1
5     1
6     2
7     2
8     2
9     2
10    2

1:5 都出现在 1 日和 3 日,所以他们很可能是一组。6:10出现在2号和4号,很有可能是2号组。

ID 5 属于第 1 组,因为即使在 2 日以 ID 6:9 观察了一次,但在 1 日和 2 日以 1:4 观察了两次,所以它最有可能属于第 1 组。

我所有的尝试都失败了。任何人都可以提供解决方案吗?

提前致谢。

编辑:

我认为我们已经使用 Jon 的 kmeans 解决方案确定了一个解决方案(在下面的评论中):

mydf_wide <- mydf %>% 
select(ID, date) %>%
distinct(ID,date)%>% # 
mutate(x = 1) %>%
spread(date, x, fill = 0)


mydf_wide$clusters <- mydf_wide %>% 
kmeans(centers = 2) %>%
pluck("cluster")

但我实际上发现 kmeans 方法每次都不太正确。见下文:

某些标签(ID)出现在同一天的组很容易被肉眼发现。有两组,一组在中间,另一组出现在两侧。集群应该按常见日期垂直,如下面乔恩的回答,但它在整个日期范围内集群。(为凌乱的轴标签道歉)

k-means 方法已在其他组中起作用,但它不能始终按共同日期进行分组。我认为聚类方法是明智的,但我想知道是否还有其他聚类方法可以比 kmeans 更好地应对?

或者,过滤方法是否可以帮助减少任何背景噪声并帮助 kmeans 方法更可靠?

再次,非常感谢任何和所有的建议。

干杯。

标签: rdategrouping

解决方案


我的想法是,您只需将每个 Date 分配给一个组,然后为每个组取平均值ID。然后,您可以从那里四舍五入到最接近的整数。在这种情况下,平均值groupID == 51.33

library(dplyr)
mydf %>% 
  mutate(group = case_when(
    Date %in% as.Date(c("2012-01-01", "2012-01-03")) ~ 1,
    Date %in% as.Date(c("2012-01-02", "2012-01-04")) ~ 2,
    TRUE                                    ~ NA_real_
  )) %>% 
  group_by(ID) %>% 
  summarise(likely_group = mean(group) %>% round)

这为您提供了以下内容:

# A tibble: 10 x 2
      ID likely_group
   <dbl>        <dbl>
 1     1            1
 2     2            1
 3     3            1
 4     4            1
 5     5            1
 6     6            2
 7     7            2
 8     8            2
 9     9            2
10    10            2

只要单个ID. 但目前还没有办法用所提供的信息来解决这种情况。


推荐阅读