web-dev-qa-db-fra.com

R - Générer une séquence de nombres

J'essaie de créer des séquences de nombre de 6 cas, mais avec des intervalles de 144 cas. 

Comme celui-ci par exemple 

c(1:6, 144:149, 288:293)

1   2   3   4   5   6 144 145 146 147 148 149 288 289 290 291 292 293

Comment pourrais-je générer automatiquement une telle séquence avec 

seq 

ou avec une autre fonction? 

17
giacomo

Je trouve la fonction sequence utile dans ce cas. Si vous aviez vos données dans une structure comme celle-ci:

(info <- data.frame(start=c(1, 144, 288), len=c(6, 6, 6)))
#   start len
# 1     1   6
# 2   144   6
# 3   288   6

alors vous pouvez le faire en une ligne avec:

sequence(info$len) + rep(info$start-1, info$len)
#  [1]   1   2   3   4   5   6 144 145 146 147 148 149 288 289 290 291 292 293

Notez que cette solution fonctionne même si les séquences que vous combinez ont des longueurs différentes.

17
josliber

Voici une approche:

unlist(lapply(c(0L,(1:2)*144L-1L),`+`,seq_len(6)))
# or...
unlist(lapply(c(1L,(1:2)*144L),function(x)seq(x,x+5)))

Voici un moyen que j'aime un peu mieux:

rep(c(0L,(1:2)*144L-1L),each=6) + seq_len(6)

Généraliser ...

rlen  <- 6L
rgap  <- 144L
rnum  <- 3L

starters <- c(0L,seq_len(rnum-1L)*rgap-1L)

rep(starters, each=rlen) + seq_len(rlen)
# or...
unlist(lapply(starters+1L,function(x)seq(x,x+rlen-1L)))
6
Frank

Cela peut aussi être fait en utilisant seq ou seq.int

x = c(1, 144, 288)
c(sapply(x, function(y) seq.int(y, length.out = 6)))

#[1]   1   2   3   4   5   6 144 145 146 147 148 149 288 289 290 291 292 293

Comme @Frank l'a mentionné dans les commentaires, voici un autre moyen de réaliser cela en utilisant la structure de données de @ josilber (particulièrement utile lorsqu'un besoin de longueur de séquence différente pour des intervalles différents)  

c(with(info, mapply(seq.int, start, length.out=len)))

#[1]   1   2   3   4   5   6 144 145 146 147 148 149 288 289 290 291 292 293
5
Veerendra Gadekar

J'utilise R 3.3.2. OSX 10.9.4

J'ai essayé:

a<-c()  # stores expected sequence
f<-288  # starting number of final sub-sequence
it<-144 # interval
for (d in seq(0,f,by=it))
{
    if (d==0)
    {
        d=1
    }
    a<-c(a, seq(d,d+5))
    print(d)
}
print(a)

ET la séquence attendue stocke dans un fichier.

[1] 1 2 3 4 5 6 144 145 146 147 148 149 288 289 290 291 292 293

Et un autre essai:

a<-c()  # stores expected sequence
it<-144 # interval
lo<-4   # number of sub-sequences
for (d in seq(0,by=it, length.out = lo))
{
    if (d==0)
    {
        d=1
    }
    a<-c(a, seq(d,d+5))
    print(d)
}
print(a)

Le résultat:

[1] 1 2 3 4 5 6 144 145 146 147 148 149 288 289 290 291 292 293 432 433 434 435 436 437

0
Nick Dong