当前位置: 首页 > 知识库问答 >
问题:

基于条件的折叠

勾通
2023-03-14

此问题与几天前发布的问题类似,将行从0折叠到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

现在只按< code >事件折叠行。身份证明..其中时间差小于或等于60,即< code>diff

 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

正在寻找有关如何创建这种折叠数据集的帮助。提前谢谢。

共有2个答案

闻人宜
2023-03-14

您需要一个符合您需求的分组列:

... %>% mutate(
  grp = ifelse(diff <= 60,
               paste0(Incident.ID.., "origin"), 
               paste0(Incident.ID.., diff)
  ))

这将为差异小于60的行创建一个相同的分组(在Incident.ID.中),否则是唯一的。(假设<code>diff</code>是唯一的——如果您可能有大于60的重复diff,请使用<code>row_number()</code>而不是<code>粘贴</code>中的<code>diff>/code,以确保它是唯一的。)将其用作折叠代码的分组列。

呼延鹏云
2023-03-14

我建议制作一个新的分组变量。我得到了如下期望的结果:

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))

我基本上是通过条件< code>diff来决定一个新组应该从哪一行开始

首先< code>ungroup很重要,否则< code>cumsum只在组内有效。

 类似资料:
  • 我有一张有科林斯的桌子 1 |姓名1 | 40 1 |姓名2 | 45 2 |姓名3 | 30 2 |姓名4 | 39 结果我想要这样 1 |名称1 | 40 | 2 |名称3 | 30 1 |名称2 |名称45 | 2 |名称4 | 39 大约有5公里行。 谢谢

  • 我有一个这样的数据集 我想创建列(visit_no)。每当间隙大于1时,我们需要在接下来的行中将visit_no值增加1,直到我们找到另一个值,它将保持不变 这是数据框架

  • 问题内容: 嗨,有一种方法可以根据与SELECT语句其余部分不同的条件来执行SUM(total_points),所以我希望每行<= to $ chosentrack的SUM(total_points)吗?但SELECT语句的其余条件必须满足以下条件。我需要将它们全部归还..当我填充一个联赛桌时。 非常感谢您的帮助。 问题答案: 您也可以将总和放在case语句中,在case语句中评估其他条件,然后仅

  • 我有一些与jdbc相关的通用代码,我想单独打包到一个可运行的jar中,其中已经包含了所需的jdbc库,因此每个数据库类型都有一个单独的可运行jar。源代码将保持不变,但打包的jdbc jar将不同。 例如jdbc app postgres。jar将只包含postgres jdbc jar,而jdbc应用程序mysql。jar将包含mysql jdbc jar。 是否可以使用gradle对任务或任何

  • 我试图为数据集创建多水平条形图。这些数据涉及跑步比赛的比赛时间。 Dataframe有以下列:名称、年龄组、完成时间、完成地点、家乡。下面是示例数据。 我想创建一个类似下图的条形图。每个年龄组将有一个条形图,最快的跑步者在图表的底部,跑步者的名字与城市和次数跑了比赛低于他们的名字。 我需要一个for循环还是一个简单的groupby工作?每个年龄组的数量和大小可以根据种族动态变化,因此它不是一个常数

  • 我想在spring验证器中创建基于条件的验证。我有一个UserDTO类,因为有两个DTO类带有注释。 如果我传递isPrimary,那么它应该只验证primaryDTO bean,而忽略secondoryDTO验证。 请引导。 谢谢