在R中查找向量块长度分布

时间:2012-07-18 02:08:44

标签: r apply lapply

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

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

非常感谢。

3 个答案:

答案 0 :(得分:2)

> ans<-rle(x)
> table(ans)
       values
lengths 0 1
      2 0 2
      3 1 0
      4 1 1

答案 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

答案 2 :(得分: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