2015-03-19 34 views
5

兩個向量之間的所有整數,我有兩個向量:序列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 

最好以某種方式矢量。開始矢量將始終大於相應元素的完成矢量。

回答

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而不是seqseq.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個字符! – 2015-03-19 10:09:41

+0

@ColonelBeauvel,true :-) – A5C1D2H2I1M1N2O1R2T1 2015-03-19 10:11:59

+1

這不僅僅是爲了節省3個字符,還要避免簡化結果。例如'mapply(「:」,c(0,10,20),c(9,19,29))'不會產生一個'list'。使用'Map'或者添加'SIMPLIFY = FALSE'。 – nicola 2015-03-19 10:17:45

3

與@ColonelBeauvel和@nicola同意,雖然你可以使用序列代替 ':',因此

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