计算因子的序列

时间:2018-04-19 07:08:19

标签: r

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

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替换1,用B替换2,然后使用{{1}在as.numeric上,以便我可以使用df$Event。但是,从长远来看,这似乎并不实用,那么另一种更有效的方法是什么呢?

2 个答案:

答案 0 :(得分:4)

如果您的“事件”列是因子变量,您只需将其变为字符变量并在其上运行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

答案 1 :(得分:0)

如评论所示,将变量设置为字符以使用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