运行 数据帧的长度编码

run length encoding on dataframe

我可以使用以下公式在单个向量上找到 运行 长度编码

dat <-c(1,1,1,1,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1)
dat1<-data.frame(dat)    
run <- rle(dat1$dat>0)
duration <- rep(run$lengths, run$lengths)
duration

#[1]  4  4  4  4  1  1  5  5  5  5  5 10 10 10 10 10 10 10 10 10 10

问题是我需要在数据框上创建相同的函数来为每一列创建持续时间。

dat2<-data.frame(dat,dat,dat)
apply(tt,2,rle)

$dat
Run Length Encoding
  lengths: int [1:5] 4 1 1 5 10
  values : num [1:5] 1 0 1 0 1

$dat.1
Run Length Encoding
  lengths: int [1:5] 4 1 1 5 10
  values : num [1:5] 1 0 1 0 1

$dat.2
Run Length Encoding
  lengths: int [1:5] 4 1 1 5 10
  values : num [1:5] 1 0 1 0 1

应用后我得到了一个列表。 但我不知道如何为每个向量创建持续时间矩阵以输出持续时间 data.frame。

谢谢

一种方法如下:

dat <-c(1,1,1,1,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1)
dat2<-data.frame(dat,dat,dat)

我唯一做的就是将单个矢量代码包装在函数 lapply 中,然后将输出转换为 data.frame。你得到每列的持续时间。输出是 data.frame.

dat3 <- data.frame(lapply(dat2, function(x) {
  run <- rle(x>0)
  duration <- rep(run$lengths, run$lengths)
  duration
}))

作为另一种选择,您可以根据@akrun 的评论使用 inverse.rle

data.frame(lapply(dat2, function(x) inverse.rle(within.list(rle(x>0), 
                                                            values <- lengths))))

输出:

> dat3
   dat dat.1 dat.2
1    4     4     4
2    4     4     4
3    4     4     4
4    4     4     4
5    1     1     1
6    1     1     1
7    5     5     5
8    5     5     5
9    5     5     5
10   5     5     5
11   5     5     5
12  10    10    10
13  10    10    10
14  10    10    10
15  10    10    10
16  10    10    10
17  10    10    10
18  10    10    10
19  10    10    10
20  10    10    10
21  10    10    10