2012-07-18 21 views
0

我有以下矢量。它是一个很大的矢量,但为了说明的目的,我会尽量缩短它的大小。在R中查找矢量块长度分布

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 

非常感谢。

回答

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 
+0

我喜欢这个解决方案,因为它提供了数据帧格式。其他人也工作。非常感谢。的确非常有用。 – broccoli 2012-07-18 04:06:19

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