私は次のベクトルを持っています。これは大きなベクトルですが、説明のために短くしておきます。
x = c(1,1,1,1,0,0,0,0,1,1,0,0,0,1,1)
1はベクトル内のチャンクになっていることに注意してください。この場合、4つの1のチャンクと2つの1の2つのチャンクがあります。この分布を簡単かつ効率的に見つけるにはどうすればよいですか?期待される出力は
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