2015-03-19 4 views
5

У меня есть два вектора:Sequence все целые числа между двумя векторами в R

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

Я хотел что-то вроде этого, чтобы работать ...

Начало: Готово

Но, конечно, не.

Я хотел бы получить список вроде следующего:

[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 

Предпочтительно, чтобы в какой-то векторизованного образом. Вектор Start всегда будет больше, чем вектор Finish для соответствующего элемента.

ответ

12

Просто используйте 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 
## 

Можно, конечно, использовать Vectorize, но это всего лишь оболочка для mapply. Однако Vectorize не может использоваться с примитивными функциями, поэтому вам нужно будет указать seq.default, а не seq, или seq.int.

Пример:

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

или Карта, чтобы получить 3 символа в команде! –

+0

@ColonelBeauvel, true :-) – A5C1D2H2I1M1N2O1R2T1

+1

Это не просто сохранить 3 символа, но и избежать упрощения результата. Например, «mapply» («:», c (0,10,20), c (9,19,29)) 'не создает« список ». Либо используйте «Карта», либо добавьте «SIMPLIFY = FALSE». – nicola

3

Согласен с @ColonelBeauvel и @nicola, хотя вы можете использовать SEQ вместо ':', следовательно,

Start = c(1,10,20) 
Finish = c(9,19,30) 
Map(seq, Start, Finish) 
Смежные вопросы