运行 数据帧的长度编码
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
我可以使用以下公式在单个向量上找到 运行 长度编码
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