我有以下向量。这是一个很大的向量,但为了说明的目的,我会保持简短。
x = c(1,1,1,1,0,0,0,0,1,1,0,0,0,1,1)
请注意,1 在向量中以块的形式出现。在这种情况下,有四个 1 的块,两个 1 的块。如何以简单有效的方式找到此分布?预期输出为
chunk.length freq
4 1
2 2
提前非常感谢。
> ans<-rle(x)
> table(ans)
values
lengths 0 1
2 0 2
3 1 0
4 1 1
利用rle
rle_results <- rle(x)
table(rle_results$length)
## 2 3 4
## 2 1 2
或者只用 x == 1 得到那些
table(rle_results$length[rle_results$values == 1])
## 2 4
## 2 1
您可以将其包装在一个函数中以获取 data.frame
rle_function <- function(x, what = NULL){
rle_results <- rle(x)
if(is.null(what)){
what <- unique(x)
}
.table <- table(rle_results$length[rle_results$values %in% what])
data.frame(chunk.length = rownames(.table), freq = as.numeric(.table))
}
rle_function(x)
## chunk.length freq
## 1 2 2
## 2 3 1
## 3 4 2
rle_function(x, what = 1)
## chunk.length freq
## 1 2 2
## 2 4 1
rle_function(x, what = 0)
## chunk.length freq
## 1 3 1
## 2 4 1
你正在寻找rle
.
rle(x)
#Run Length Encoding
# lengths: int [1:5] 4 4 2 3 2
# values : num [1:5] 1 0 1 0 1
table(rle(x)$length[rle(x)$values == 1])
#2 4
#2 1