【问题标题】:Count consecutive values in groups with condition with dplyr and rle使用 dplyr 和 rle 计算具有条件的组中的连续值
【发布时间】:2017-02-26 05:55:24
【问题描述】:

我的问题与下面提出的问题非常相似,但是我想添加一个附加命令以仅返回序列具有 2 个以上连续值的情况。

当给定的序列运行在给定的时代和给定的年份内有超过 2 个连续数字时,我如何计算连续“成功”的数量(即 $consec 中的 1 个)?

类似问题:Summarize consecutive failures with dplyr and rle .为了比较,我修改了该问题中使用的示例:

library(dplyr)
df <- data.frame(Era=c(1,1,1,1,1,1,1,1,1,1),Year = c(1,2,2,3,3,3,3,3,3,3), consec = c(0,0,1,0,1,1,0,1,1,1))

df %>%
  group_by(Era,Year) %>%
  do({tmp <- with(rle(.$consec==1), lengths[values])
      data.frame(Year= .$Year, Count=(length(tmp)))}) %>% 
  slice(1L)

> Source: local data frame [3 x 3]
> Groups: Era, Year

>   Era Year Count
> 1   1    1     0
> 2   1    2     1
> 3   1    3     2
> 

我现在只需要添加一个条件以仅包含 >2 序列中连续数字的情况。期望的结果:

> Source: local data frame [3 x 3]
> Groups: Era, Year

>   Era Year Count
> 1   1    1     0
> 2   1    2     0
> 3   1    3     1

任何建议将不胜感激。

【问题讨论】:

    标签: r conditional dplyr sequence run-length-encoding


    【解决方案1】:

    我们需要用lengths创建一个逻辑索引并获取它的sum

    df %>%
       group_by(Era, Year) %>% 
       do({ tmp <- with(rle(.$consec), sum(lengths > 2))
       data.frame(Count = tmp)})
    #   Era  Year Count
    #  <dbl> <dbl> <int>
    #1     1     1     0    
    #2     1     2     0
    #3     1     3     1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-07
      • 2014-04-16
      • 2016-06-02
      • 1970-01-01
      相关资源
      最近更新 更多