2015-03-19 35 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)