r - 根据常见日期创建组变量
问题描述
我有一个包含动物 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 方法更可靠?
再次,非常感谢任何和所有的建议。
干杯。
解决方案
我的想法是,您只需将每个 Date 分配给一个组,然后为每个组取平均值ID
。然后,您可以从那里四舍五入到最接近的整数。在这种情况下,平均值group
为ID == 5
1.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
. 但目前还没有办法用所提供的信息来解决这种情况。
推荐阅读
- python - 多处理 AsyncResult.get() 在 Python 3.7.2 中挂起,但在 3.6 中没有
- python - 字符串索引必须是整数 django rest 框架
- c++ - 使用代码移动光标并打开文件夹
- php - 如何通过在 Laravel 5.7 的同一列中执行不同的查询来创建不同的别名
- mysql - LIMIT 1 怎么可能使查询变慢
- html - 如何使用 CSS 将标题(h2)移动到图形和图像下方?
- azure - 即使在将我的计划从 D-1(共享)扩展到 B-1(基本)之后,也看不到允许您上传 SSL 证书的屏幕
- office365 - 新的 Outlook - Pin Office 插件?
- php - Apache Alias 缺少 POST 和 GET
- java - 未调用 Java 线程通知