我有一个文件(appx 9K记录),我希望首先根据组进行聚合,然后根据彼此相隔7天的日期进行聚合。然而,我不明白为什么结果是这样的。我意识到我可以通过其他方法来实现与这个特定示例相同的结果,但它将变得更加复杂,还有其他我对使用tibbletime感兴趣的原因。下面是一个可重复使用的示例:
library(tidyverse)
library(lubridate)
library(tibbletime) #devtools::install_github("business-science/tibbletime")
TEST_ROLL <- as_tibble(list(
CITY_ID = c("1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "2",
"2", "2", "2"),
CAFE_ID = c("1001", "1001", "1001", "1001", "2002", "2002", "2002", "2002",
"3003", "3003", "3003", "3003", "4004", "4004", "4005", "4005"),
HEALTH_REPORT_ID = c("1425", "1532", "1666", "1989", "2166", "2457", "2776",
"2999", "3409", "3497", "3595", "3786", "4105", "4511", "4567", "4580"),
REPORT_SUBMIT_DATE = ymd( c( "2013-05-26", "2013-05-27", "2013-05-31",
"2013-05-31", "2016-05-26", "2016-05-27", "2016-05-31", "2016-05-31", "2018-
05-26", "2018-05-27", "2018-05-31", "2018-05-31", "2017-01-01", "2017-01-
05", "2017-02-04", "2017-02-10"))))我想做的是,从每个咖啡馆的第一份报告开始,将7天内提交的健康报告计算为只有一份报告,这样它们就不会被过多计算。
首先,我尝试使用"7天“作为句号:
TEST_ROLL %>%
group_by(CAFE_ID) %>%
as_tbl_time(REPORT_SUBMIT_DATE) %>%
mutate(ROLL_DATE = collapse_index(REPORT_SUBMIT_DATE, "7 day"))
# A time tibble: 16 x 5
# Index: REPORT_SUBMIT_DATE
# Groups: CAFE_ID [5]
CITY_ID CAFE_ID HEALTH_REPORT_ID REPORT_SUBMIT_DATE ROLL_DATE
<chr> <chr> <chr> <date> <date>
1 1 1001 1425 2013-05-26 2013-05-27
2 1 1001 1532 2013-05-27 2013-05-27
3 1 1001 1666 2013-05-31 2013-05-31
4 1 1001 1989 2013-05-31 2013-05-31
5 1 2002 2166 2016-05-26 2016-05-27
6 1 2002 2457 2016-05-27 2016-05-27
7 1 2002 2776 2016-05-31 2016-05-31
8 1 2002 2999 2016-05-31 2016-05-31
9 1 3003 3409 2018-05-26 2018-05-27
10 1 3003 3497 2018-05-27 2018-05-27
11 1 3003 3595 2018-05-31 2018-05-31
12 1 3003 3786 2018-05-31 2018-05-31
13 2 4004 4105 2017-01-01 2017-01-05
14 2 4004 4511 2017-01-05 2017-01-05
15 2 4005 4567 2017-02-04 2017-02-04
16 2 4005 4580 2017-02-10 2017-02-10这不是我想要的。如果它有效,那么cafe 1001的所有四个报告都将具有相同的滚动日期,因为它们都在7天内。那么为什么在result列中拆分成两个日期呢?
我试着使用“每周”而不是"7天“,然后我得到了这个结果:
TEST_ROLL %>%
group_by(CAFE_ID) %>%
as_tbl_time(REPORT_SUBMIT_DATE) %>%
mutate(ROLL_DATE = collapse_index(REPORT_SUBMIT_DATE, "weekly"))
# A time tibble: 16 x 5
# Index: REPORT_SUBMIT_DATE
# Groups: CAFE_ID [5]
CITY_ID CAFE_ID HEALTH_REPORT_ID REPORT_SUBMIT_DATE ROLL_DATE
<chr> <chr> <chr> <date> <date>
1 1 1001 1425 2013-05-26 2013-05-31
2 1 1001 1532 2013-05-27 2013-05-31
3 1 1001 1666 2013-05-31 2013-05-31
4 1 1001 1989 2013-05-31 2013-05-31
5 1 2002 2166 2016-05-26 2016-05-27
6 1 2002 2457 2016-05-27 2016-05-27
7 1 2002 2776 2016-05-31 2016-05-31
8 1 2002 2999 2016-05-31 2016-05-31
9 1 3003 3409 2018-05-26 2018-05-26
10 1 3003 3497 2018-05-27 2018-05-31
11 1 3003 3595 2018-05-31 2018-05-31
12 1 3003 3786 2018-05-31 2018-05-31
13 2 4004 4105 2017-01-01 2017-01-05
14 2 4004 4511 2017-01-05 2017-01-05
15 2 4005 4567 2017-02-04 2017-02-04
16 2 4005 4580 2017-02-10 2017-02-10Cafe1001正是我想要的,但是Cafe2002和3003有相同的日期(不同的年份),但结果是不同的。
而Cafe4004是我想要的组合方式,但Cafe4005之间只有6天的时间,所以它们也应该组合在一起。(稍后我将对它们进行总结/统计)
你知道为什么会发生这种情况吗?谢谢!!
发布于 2018-04-06 10:16:09
我不知道你想要实现的是不是一个明智的选择。我认为使用collapse_index(REPORT_SUBMIT_DATE, "weekly")的默认行为是明智的做法。
不过,如果你想继续做你想做的事情,这里有一种方法。我认为你需要有一个非常好的概述,哪些天是在7天内的其他首先。
Date <- TEST_ROLL$REPORT_SUBMIT_DATE
truth_mat <- abs(sapply(Date, 'difftime', Date, unit = 'day')) < 7
indices <- which(truth_mat, arr.ind = TRUE)
as_tibble(indices) %>% group_by(row) %>%
summarise_at(vars(col), paste, collapse = ', ')
# # A tibble: 16 x 2
# row col
# <int> <chr>
# 1 1 1, 2, 3, 4
# 2 2 1, 2, 3, 4
# 3 3 1, 2, 3, 4
# 4 4 1, 2, 3, 4
# 5 5 5, 6, 7, 8
# 6 6 5, 6, 7, 8
# 7 7 5, 6, 7, 8
# 8 8 5, 6, 7, 8
# 9 9 9, 10, 11, 12
# 10 10 9, 10, 11, 12
# 11 11 9, 10, 11, 12
# 12 12 9, 10, 11, 12
# 13 13 13, 14
# 14 14 13, 14
# 15 15 15, 16
# 16 16 15, 16 我们可以看到{1,2,3,4}、{5,6,7,8}、{9,10,11,12}、{13,14}和{15,16}正在形成集群。让我们看看hclust是否可以检测到这些集群。
hc <- hclust(dist(Date))
plot(hc)

在这里,我们可以看到我们可以将树分成五个分支,然后我们就可以得到所需的分组。我们看到树状图表明了我们到目前为止所观察到的情况。使用hclust路线的好处是我们可以很容易地指定这些分组。
TEST_ROLL$Group <- cutree(hc, 5)
TEST_ROLL
# # A tibble: 16 x 5
# CITY_ID CAFE_ID HEALTH_REPORT_ID REPORT_SUBMIT_DATE Date
# <chr> <chr> <chr> <date> <int>
# 1 1 1001 1425 2013-05-26 1
# 2 1 1001 1532 2013-05-27 1
# 3 1 1001 1666 2013-05-31 1
# 4 1 1001 1989 2013-05-31 1
# 5 1 2002 2166 2016-05-26 2
# 6 1 2002 2457 2016-05-27 2
# 7 1 2002 2776 2016-05-31 2
# 8 1 2002 2999 2016-05-31 2
# 9 1 3003 3409 2018-05-26 3
# 10 1 3003 3497 2018-05-27 3
# 11 1 3003 3595 2018-05-31 3
# 12 1 3003 3786 2018-05-31 3
# 13 2 4004 4105 2017-01-01 4
# 14 2 4004 4511 2017-01-05 4
# 15 2 4005 4567 2017-02-04 5
# 16 2 4005 4580 2017-02-10 5注意,hclust使用method = 'complete'作为默认的欧几里德距离。您可以根据自己的意愿尝试其他方法。有关详细信息,请查看?hclust。
编辑
我刚刚意识到,您也可以通过这种方式直接使用truth_mat和indices中的分组。
groups <- as_tibble(indices) %>% group_by(row) %>%
summarise_at(vars(col), paste, collapse = ', ')
TEST_ROLL$group <- groups$col然后您可以对group列执行group_by操作,而不需要hclust。
https://stackoverflow.com/questions/49681090
复制相似问题