我有以下矢量。它是一个很大的矢量,但为了说明的目的,我会尽量缩短它的大小。在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
非常感谢。
我有以下矢量。它是一个很大的矢量,但为了说明的目的,我会尽量缩短它的大小。在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
非常感谢。
使用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
> ans<-rle(x)
> table(ans)
values
lengths 0 1
2 0 2
3 1 0
4 1 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
我喜欢这个解决方案,因为它提供了数据帧格式。其他人也工作。非常感谢。的确非常有用。 – broccoli 2012-07-18 04:06:19