1

数値の配列があるとします

a <- c(1,2,3,6,7,8,9,10,20)

「a」からの連続シーケンスの範囲だけを出力するようにRに指示する方法がある場合、たとえば、「a」の連続シーケンスは次のとおりです

1,3 6,10 20

どうもありがとう!デレク

4

3 に答える 3

2

まっすぐな方法はないと思いますが、次/前の要素が最大/最小であるかどうかを示す2つの論理ベクトルを作成できます。例えば:

data.frame(
  a,
  is_first = c(TRUE,diff(a)!=1),
  is_last = c(diff(a)!=1,TRUE)
)
# Gives you:
   a is_first is_last
1  1     TRUE   FALSE
2  2    FALSE   FALSE
3  3    FALSE    TRUE
4  6     TRUE   FALSE
5  7    FALSE   FALSE
6  8    FALSE   FALSE
7  9    FALSE   FALSE
8 10    FALSE    TRUE
9 20     TRUE    TRUE

したがって、範囲は次のとおりです。

cbind(a[c(TRUE,diff(a)!=1)], a[c(diff(a)!=1,TRUE)])
[1,]    1    3
[2,]    6   10
[3,]   20   20
于 2010-03-18T14:44:29.173 に答える
1

リスト内の各シーケンスのすべての番号が必要な場合に備えて、これを行いました(それほどエレガントではありません)。

a <- c(1,2,3,6,7,8,9,10,20)

z <- c(1,which(c(1,diff(a))!=1))

g <- lapply(seq(1:length(z)),function(i) {
if (i < length(z)) a[z[i] : (z[i+1] - 1)] 
else a[z[i] : length(a)] 
})


[[1]]
[1] 1 2 3

[[2]]
[1]  6  7  8  9 10

[[3]]
[1] 20

次に、このようなもので2D配列を取得できます

sapply(g,function(x) c(x[1],x[length(x)]))

     [,1] [,2] [,3]
[1,]    1    6   20
[2,]    3   10   20
于 2010-03-18T15:23:18.970 に答える
0
> a <- c(1,2,3,6,7,8,9,10,20)
> N<-length(a)
> k<-2:(N-1)
> z<-(a[k-1]+1)!=a[k] | (a[k+1]-1)!=a[k]
> c(a[1],a[k][z],a[N])
[1]  1  3  6 10 20
于 2010-03-18T18:51:02.780 に答える