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?
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.
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)))
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
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