【问题标题】:Count the sequences of a factor计算一个因子的序列
【发布时间】:2018-04-19 07:08:19
【问题描述】:

我有一个如下所示的数据框:

Date         Event
2018-06-01   A
2018-06-02   A
2018-06-02   B
2018-06-03   B
2018-06-04   B
2018-06-04   B
2018-06-05   A

我想提取同一事件连续多次发生的序列。因此,例如在上面显示的示例中,这会给我这个:

Event  Sequence
A      2
B      4
A      1

我尝试使用rle,但遇到了问题,因为df$Event 不是原子向量。

由于我只有两种类型的事件,我想我可以做的是将A 替换为1B 替换为2 然后在df$Event 上使用as.numeric 以便我可以使用rle。但是,从长远来看,这似乎不太实用,还有什么更有效的方法来做到这一点?

【问题讨论】:

  • 如果它是一个因素,只需使用rle(as.character(df$Event))
  • @docendodiscimus 我想as.integer 会更快
  • @MichaelChirico,我怀疑这会成为瓶颈;如果您使用描述性标签而不是级别的整数表示,结果将提供更多信息。
  • @docendodiscimus 这行得通,谢谢!由于您的回答是评论,我无法接受。

标签: r


【解决方案1】:

如果您的“事件”列是因子变量,您可以简单地将其转换为字符变量并在其上运行rle

rle(as.character(df$Event))

#Run Length Encoding
#  lengths: int [1:3] 2 4 1
#  values : chr [1:3] "A" "B" "A"

如果您想创建问题中显示的 data.frame,您可以使用

with(rle(as.character(df$Event)), data.frame(Event=values, Sequence=lengths))

#  Event Sequence
#1     A        2
#2     B        4
#3     A        1

【讨论】:

    【解决方案2】:

    正如评论的那样,将变量设置为字符以使用 rle 只是一个问题。我在这里只给出另外两种方法,使用 dplyr 或 data.table

    library(dplyr)
    library(data.table)
    
    df %>%
      group_by(rleid(Event)) %>%
      summarise(Sequence =n(),event = Event[1])
    
    df <- setDT(df)
    df[,.(Sequence =.N,event = Event)[1],by = rleid(Event)]
    
      `rleid(Event)` Sequence  event
               <int>    <int> <fctr>
    1              1        2      A
    2              2        4      B
    3              3        1      A
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      • 2016-07-31
      • 1970-01-01
      相关资源
      最近更新 更多