【问题标题】:Row aggregation when values are close enough in a column列中的值足够接近时的行聚合
【发布时间】:2012-12-23 06:07:09
【问题描述】:

我有一个包含 2 列的数据框

        time     x
  1306247226     5
  1306247236    10
  1306248127    20
  1306248187    36
  1306249248    28
  1306249258    24
  1306249259    20
  ...

我想汇总“时间”列中的值足够接近的行 (例如,假设它们的差异小于 60。)并在聚合行中将它们的“x”值相加。聚合行中的时间值将是聚合的第一行之一。 ('time' 是一个 unix 时间戳)

目标是作为这个例子的输出:

        time     x
  1306247226    15
  1306248127    20
  1306248187    36
  1306249248    72
  ...

数据集非常大,'for' 循环将需要很长时间......但如果这是唯一的选择,我可以处理它并等待。 有什么想法吗?

非常感谢!

【问题讨论】:

    标签: r time dataset row aggregation


    【解决方案1】:

    你可以使用这样的东西:

    首先我为聚合创建一个新列

    dat$gg <- cumsum(c(0,diff(dat$time)) > 60)
    

    然后我使用plyr 包来应用函数聚合

    library(plyr)
    ddply(dat,.(gg),summarise,time = head(time,1),res = sum(x))
      gg       time res
    1  0 1306247226  15
    2  1 1306248127  56
    3  2 1306249248  72
    

    评论后编辑

    Op 想要的阈值为 60,不大于 60。所以我需要将 &gt; 更改为 &gt;=

    dat$gg <- cumsum(c(0,diff(dat$time)) >= 60)
    
    ddply(dat,.(gg),summarise,time = head(time,1),res = sum(x))
      gg       time res
    1  0 1306247226  15
    2  1 1306248127  20
    3  2 1306248187  36
    4  3 1306249248  72
    

    【讨论】:

    • 它们不相同,因为 OP 希望阈值为 60,而不是大于 60。因此,&gt; 应替换为 &gt;=
    猜你喜欢
    • 2019-06-01
    • 2015-02-19
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    相关资源
    最近更新 更多