这个问题是类似的问题已经发布前几天,Collapse rows from 0 to 0
这里的新的转折,这是从以前的问题,不同的是这一点,我们如何通过ID为只有那些行,其中不同的时间小于或等于60倒塌行。
例如,使用相同的数据集
Incident.ID.. date product
INCFI0000029582 2014-09-25 08:39:45 foo
INCFI0000029582 2014-09-25 08:39:45 foo
INCFI0000029582 2014-09-25 08:39:48 bar
INCFI0000029582 2014-09-25 08:40:44 foo
INCFI0000029582 2014-10-10 23:04:00 foo
INCFI0000029587 2014-09-25 08:33:32 bar
INCFI0000029587 2014-09-25 08:34:41 bar
INCFI0000029587 2014-09-25 08:35:24 bar
INCFI0000029587 2014-10-10 23:04:00 foo
df <- structure(list(Incident.ID.. = c("INCFI0000029582", "INCFI0000029582","INCFI0000029582",
"INCFI0000029582", "INCFI0000029582", "INCFI0000029587", "INCFI0000029587",
"INCFI0000029587", "INCFI0000029587"), date = c("2014-09-25 08:39:45","2014-09-25 08:39:45",
"2014-09-25 08:39:48", "2014-09-25 08:40:44", "2014-10-10 23:04:00",
"2014-09-25 08:33:32", "2014-09-25 08:34:41", "2014-09-25 08:35:24",
"2014-10-10 23:04:00"), product =
c("foo","foo","bar","foo","foo","bar","bar","bar","foo")),
class = "data.frame", row.names = c(NA,
-L))
这种计算由ID的时间差
library(dplyr)
library(lubridate)
df1 <- df %>%
group_by(Incident.ID..) %>%
arrange(ymd_hms(date)) %>%
mutate(diff = c(0, diff(ymd_hms(date))))
这导致了这个新列差异,如下图所示
Incident.ID.. date product diff
INCFI0000029582 2014-09-25 08:39:45 foo 0
INCFI0000029582 2014-09-25 08:39:45 foo 0
INCFI0000029582 2014-09-25 08:39:48 bar 3
INCFI0000029582 2014-09-25 08:40:44 foo 56
INCFI0000029582 2014-10-10 23:04:00 foo 1347796
INCFI0000029587 2014-09-25 08:33:32 bar 0
INCFI0000029587 2014-09-25 08:34:41 bar 69
INCFI0000029587 2014-09-25 08:35:24 bar 43
INCFI0000029587 2014-10-10 23:04:00 foo 1348116
现在仅通过Incident.ID..
其中时间差小于或等于60折叠的行,即diff <= 60
应导致这样的最终数据集
Incident.ID.. DateMin DateMax product diff_collapse
INCFI0000029582 2014-09-25 08:39:45 2014-09-25 08:40:44 foo,bar,foo 0,0,3,56
INCFI0000029582 2014-09-25 08:40:44 2014-10-10 23:04:00 foo 1347796
INCFI0000029587 2014-09-25 08:33:32 2014-09-25 08:34:41 bar 0
INCFI0000029587 2014-09-25 08:34:41 2014-09-25 08:35:24 bar,bar 69,43
INCFI0000029587 2014-09-25 08:35:24 2014-10-10 23:04:00 foo 1348116
找一本关于如何创建这样一个倒塌的数据集提供一些帮助。提前致谢。
我建议做一个新的分组变量。我像这样期望的结果:
df1 <- df %>%
group_by(Incident.ID..) %>%
arrange(ymd_hms(date)) %>%
mutate(diff = c(0, diff(ymd_hms(date)))) %>%
ungroup() %>%
arrange(Incident.ID.., date) %>%
mutate(group = cumsum(diff > 60 | diff == 0)) %>%
group_by(group) %>%
summarise(DateMin = min(date),
DateMax = max(date),
diff_collapse = toString(diff),
product = toString(product))
我基本上决定在哪一行的新组应通过条件diff > 60 | diff == 0
开始:因为这是崩溃状态,diff > 60
和diff == 0
,因为一个新的事件开始时的。你也可以写Incident.ID.. != lag(Incident.ID..)
。在cumsum
包裹它增加了柜台每一个新的组开始时间。
它首先要ungroup
是很重要的,否则cumsum
只适用于组。
您需要满足您的需求的一个分组列:
... %>% mutate(
grp = ifelse(diff <= 60,
paste0(Incident.ID.., "origin"),
paste0(Incident.ID.., diff)
))
这就产生了一个石斑鱼即对于行相同的(Incident.ID..
内),其中差异小于60,而且是唯一的,否则。 (假设diff
是独一无二的---如果你有可能复制的diff大于60,使用row_number()
代替diff
在paste
,以确保它是独一无二的。)使用,作为您的崩溃代码分组列。