2013-10-11 10 views
8

Fondamentalmente voglio generare una sequenza, dicono:Genera una sequenza come 112.123.123.412.345

n è 2, la sequenza sarà 112
n è 3, sequenza è 112123
n è 5, la sequenza è 112.123.123.412.345

sono venuto su con una soluzione

n=5 
seq=1 
for (i in 2:n){ 
    seq=c(seq,rep(1:n,len=i)) 
} 

mi chiedo se c'è un modo può farlo senza per il ciclo?

risposta

18

Uso sequence:

> sequence(1:5) 
[1] 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 
+8

C'è anche qualcosa di soddisfacente nel fare 'sequence (sequence (5))' :-) – flodel

+0

@flodel: I love it! –

+4

@Chris: assicurati di leggere le sezioni "Vedi anche" dei file della guida. '? seq' menziona' sequenza' lì. –

7

Ecco una possibilità:

n<-5 
unlist(lapply(1:n,function(x) 1:x)) 
## [1] 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 
+2

più funzionale, sarebbe 'non elencati (lapply (seq (n), seq))' – flodel

+1

+1, poiché 'sequence' è definita come' funzione (nvec) non elencati (lapply (nvec, seq_len)) '. –

+0

Grazie mille ragazzi! Anche se questa domanda può essere risolta da sequence(), in realtà è una domanda del mio tutorial, che chiede come fare qualcosa usando lapply() invece di loop, penso che questo sia quello che la domanda del tutorial sta cercando. –

4

E avrebbe fatto qualcosa di simile:

do.call('c', sapply(1:5, seq, from = 1)) 
# [1] 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 
1

ho letto male la questione "come generare che fastidiosa sequenza di puzzle ", che diventa 1,11,21,1112,3112, ... :-). Quindi ho pensato che potrei scrivere una soluzione a questo.

puzseq<-function(seqlen) { 
theseq<- list(1) 
for(j in 2:seqlen) { 

thetab<-table(theseq[[j-1]]) 
theseq[[j]]<-unlist(sapply(1:length(thetab), function(k) c(thetab[k], as.numeric(names(thetab)[k])))) 
} 
return(theseq) 
} 
+1

Questo è difficile da leggere; la formattazione del codice non è standard e non coerente. –

+0

@ClaytonStanley potresti chiarire ciò che trovi poco chiaro? Meglio essere più che la mancanza di rientri per i contenuti del loop! –

Problemi correlati