0

私は次のベクトルを持っています。これは大きなベクトルですが、説明のために短くしておきます。

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

よろしくお願いします。

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 に答える