2015-03-19 28 views
5

Ho due vettori:sequenza tutti i numeri interi tra due vettori in R

Start = c(1,10,20) 
Finish = c(9,19,30) 

Vorrei qualcosa di simile al lavoro ...

Inizio: Fine

Ma naturalmente non.

vorrei produrre una lista come la seguente:

[1] 1,2,3,4,5,6,7,8,9 
[2] 10 11 12 13 14 15 16 17 18 19 
[3] 20 21 22 23 24 25 26 27 28 29 30 

Preferibilmente in qualche modo vettorizzati. Il vettore Start sarà sempre più grande del vettore Finish per un elemento corrispondente.

risposta

12

Basta usare mapply:

Start = c(1,10,20) 
Finish = c(9,19,30) 
mapply(":", Start, Finish) 
## [[1]] 
## [1] 1 2 3 4 5 6 7 8 9 
## 
## [[2]] 
## [1] 10 11 12 13 14 15 16 17 18 19 
## 
## [[3]] 
## [1] 20 21 22 23 24 25 26 27 28 29 30 
## 

Si potrebbe, ovviamente, utilizzare anche Vectorize, ma questo è solo un wrapper per mapply. Tuttavia, Vectorize non può essere utilizzato con le funzioni primitive, quindi sarà necessario specificare seq.default anziché seq o seq.int.

Esempio:

Vectorize(seq.default)(Start, Finish) 
## [[1]] 
## [1] 1 2 3 4 5 6 7 8 9 
## 
## [[2]] 
## [1] 10 11 12 13 14 15 16 17 18 19 
## 
## [[3]] 
## [1] 20 21 22 23 24 25 26 27 28 29 30 
## 
+3

o sulla mappa per guadagnare 3 carattere nel comando! –

+0

@ColonelBeauvel, true :-) – A5C1D2H2I1M1N2O1R2T1

+1

Non è solo per salvare 3 caratteri, ma anche per evitare che il risultato sia semplificato. Ad esempio 'mapply (": ", c (0,10,20), c (9,19,29))' non produce un 'elenco'. Utilizza 'Map' o aggiungi' SIMPLIFY = FALSE'. – nicola

3

d'accordo con @ColonelBeauvel e @nicola, anche se si potrebbe utilizzare seguenti invece di ':', quindi

Start = c(1,10,20) 
Finish = c(9,19,30) 
Map(seq, Start, Finish) 
Problemi correlati