【问题标题】:aggregate by consecutive values and group按连续值和组聚合
【发布时间】:2016-05-20 01:47:26
【问题描述】:

在以下数据集中,我按自行车计数为零的实例过滤了 JSON 间隔。 station_summary_id 代表一个时间间隔,并以连续整数递增(在示例中,您看到 64129 与“2014-10-01 07:00:00”相关联,然后 64130 与“2014-10-01 07:10”相关联:00" 等。station_id 是电台的唯一 ID。

我的目标是:通过station_id 找到最长的连续整数链 - 换句话说 - 找出每个站为空的最长时间段。我知道这需要首先按station_id 分组,然后计算station_summary_id 中最长的连续序列,但我不确定如何为所有站ID 自动执行此操作。

> 暗淡(数据) [1] 307039 7 > 头部(数据) station_id status available_bike_count created_at station_summary_id 月 年 13694 2 活跃 0 2014-10-01 07:00:00 64129 10 2014 13702 10 活动 0 2014-10-01 07:00:00 64129 10 2014 13706 14 活跃 0 2014-10-01 07:00:00 64129 10 2014 13710 18 活跃 0 2014-10-01 07:00:00 64129 10 2014 13713 21 活跃 0 2014-10-01 07:00:00 64129 10 2014 13728 36 活跃 0 2014-10-01 07:00:00 64129 10 2014

可重现的例子:

> 输入(数据) 结构(列表(station_id = c(2L,2L,2L,2L,2L,2L,2L,2L, 2L,2L,2L,2L,2L,2L,2L,2L,2L,2L,2L,2L,2L,2L,2L,2L, 2L,3L,3L,3L,3L,3L,3L,3L,3L,3L,3L,3L,3L,3L,3L,3L, 3L,3L,3L,3L,3L,3L,3L,3L,3L,3L,4L,4L,4L,4L,4L,4L, 4L,4L,4L,4L,4L,4L,4L,4L,4L,4L,4L,4L,4L,4L,4L,4L, 4L, 4L, 4L), 状态 = 结构(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "Active", class= "factor"), available_bike_count = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), station_summary_id = c(64129L, 64130L、64131L、64132L、64133L、64134L、64136L、64138L、64139L、 64140L、64141L、64142L、64143L、64144L、64145L、64146L、64147L、 64148L、64149L、64150L、64152L、64161L、64162L、64170L、64273L、 64322L、64324L、64341L、64884L、64886L、64896L、64897L、64898L、 64899L、64900L、64901L、64902L、64903L、64904L、64905L、64906L、 64907L、64908L、64909L、64910L、64911L、64912L、64913L、64917L、 64918L、65214L、65219L、66314L、66439L、66450L、66583L、66587L、 66589L、66600L、66872L、66880L、67037L、67048L、82854L、82855L、 82856L、82857L、82858L、82859L、82860L、82861L、82862L、82863L、 82867L, 82868L), 月 = c(10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L), 年份 = c(2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L)), .Names = c("station_id", “状态”、“available_bike_count”、“station_summary_id”、“月”、 "年"), row.names = c(NA, -75L), class= "data.frame")

【问题讨论】:

  • 您的示例不完整。您必须添加您期望从示例中获得的输出。你认为什么输出是正确的答案。

标签: r sequence


【解决方案1】:

请参阅?rle 以更好地了解游程编码的可能用途。

使用您的新数据:

> max( rle( diff(dat$station_summary_id) )$lengths )
[1] 12

在修改后的示例中使用多个 station_id,我发现 aggregate 工作得相当好:

 aggregate( dat$station_summary_id, dat['station_id'], FUN= function(d) max( rle( diff(d) )$lengths ) )
#---------
  station_id  x
1          2 12
2          3 17
3          4  9

这也成功了 data.table 语法:

dat <- setDT(dat)
dat[,   max( rle( diff(station_summary_id) )$lengths ) , by='station_id']
#-----
   station_id V1
1:          2 12
2:          3 17
3:          4  9

【讨论】:

  • 谢谢,但nrow 不能解决问题。我需要计算连续整数的最大数量,还需要计算超过六个连续整数的次数(一个站空置超过一小时的次数)。我用上面的一个station_id 对数据进行了子集化。如您所见,并非station_summary_id 列中的所有值都是连续的。上面的代码我试过了,但是输出是2,不正确
  • 你能明白为什么我发现说一个答案“不正确”而不说你认为正确的答案是相当令人反感的吗?
  • 但是,当我在整个数据集上使用此代码时,我无法分辨哪些值属于哪个station_id,它只会产生一个长列表
  • 对于经过测试的代码,需要提供一个足够复杂的示例。大概您会使用聚合或lapply( split( , ), fun) 或其他一些策略来迭代单独的station_id。
  • 我在上面包含了一个更复杂的数据框
【解决方案2】:

您可以使用dplyrdata.tablebase R 来按站号查找最长持续时间。请参阅@42 在调用中心提到的函数rle

#dplyr
library(dplyr)
data %>% group_by(station_id) %>% 
  summarise(with(rle(station_summary_id), values[which.max(lengths)]))

#data.table
library(data.table)
setDT(data)[,list(with(rle(station_summary_id),
               values[which.max(lengths)])),by=station_id]

#base R
lapply(split(data$station_summary_id, data$station_id), 
       function(x) with(rle(x), values[which.max(lengths)]))

编辑

使用新数据:

dt[,with(rle(diff(station_summary_id) > 1), max(lengths[!values])), by=station_id]

【讨论】:

  • 谢谢,但这些代码不会产生每个站 station_summary_id 中连续整数的最大数量之和的输出。我在上面添加了一些数据来澄清(我用一个station_id子集)
  • 这适用于上面的示例,但是当我在整个数据集上尝试时,我收到以下错误:Error in [.data.table(data, , with(rle(diff(station_summary_id) &gt; 1), : Column 1 of result for group 434 is type 'double' but expecting type 'integer'. Column types must be consistent for each group. In addition: Warning message: In max(lengths[!values]) : no non-missing arguments to max; returning -Inf
  • 您的数据不是您在问题中显示的格式。我没有你的数据。你希望我如何修复我看不到的东西?你问它是如何完成的,我向你展示了框架。你期待我为你完成你的项目吗?
  • 如果您不愿意发布数据中的实际可变性,我无法将自己神奇地插入您的计算机。你不是雇佣我来为你竞争工作。你问能不能做到,答案是肯定的。请花时间对适用于您提供的数据的解决方案的应用程序进行故障排除。
  • 抱歉,我在上面包含了一个更可变的数据框。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 2022-01-26
  • 2018-10-10
相关资源
最近更新 更多