0

我有以下向量。这是一个很大的向量,但为了说明的目的,我会保持简短。

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

提前非常感谢。

4

3 回答 3

2
> ans<-rle(x)
> table(ans)
       values
lengths 0 1
      2 0 2
      3 1 0
      4 1 1
于 2012-07-18T02:23:21.290 回答
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
于 2012-07-18T02:23:27.710 回答
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 
于 2012-07-18T02:23:31.003 回答