2015-03-19 7 views
5

Mam dwa wektory:Sequence wszystkie liczby całkowite między dwoma wektorami w R

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

chciałbym coś takiego działa ...

Początek: Wykończenie

Ale oczywiście nie ma wartości.

chciałbym produkować listę tak:

[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 

Korzystnie w pewnym vectorized sposób. Wektor Start będzie zawsze większy niż wektor Zakończ dla odpowiedniego elementu.

Odpowiedz

12

Wystarczy użyć 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 
## 

Możesz, oczywiście, również użyć Vectorize, ale to tylko nakładka na mapply. Nie można jednak używać funkcji Vectorize z funkcjami pierwotnymi, dlatego należy podać wartość seq.default zamiast seq lub.

Przykład:

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

lub na mapie, aby uzyskać 3 znak w komendzie! –

+0

@ColonelBeauvel, true :-) – A5C1D2H2I1M1N2O1R2T1

+1

Nie chodzi tylko o zachowanie 3 znaków, ale także o uproszczenie wyniku. Na przykład 'mapply (": ", c (0,10,20), c (9, 19, 29))' nie tworzy 'listy'. Użyj 'Map' lub dodaj' SIMPLIFY = FALSE'. – nicola

3

Zgadzam się z @ColonelBeauvel i @nicola, choć można użyć nast zamiast ':', stąd

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