2011-09-07 29 views
28

在R以外的增量,我可以键入[R列清单比1

> alist<-c(1:10) 
> alist 
[1] 1 2 3 4 5 6 7 8 9 10 

我如何通过增量不是1上升一个列表?例如一个偶数列表

+4

我敢打赌,通过扫描[手册]的前几十个条目,可以很快地发现问题的答案(http://cran.r-project.org/doc/manuals/R -intro.html)。 (提示:2.3) – joran

回答

50

seq命令执行此操作。执行seq(1,10,1)做什么1:10。但是,您可以将最后一个参数更改为其他参数,以便可以采取任意大小的步骤。

> #a vector of even numbers 
> seq(0, 10, 2) 
> [1] 0 2 4 6 8 10 

另外,你所做的是一个矢量,而不是一个列表。一个列表可以包含许多完全不同类型的信息,而向量在索引的每个位置都包含相同类型的值。

+1

+1'创建一个向量,不需要c()'作为一个更进一步,只是为了混淆事物,一个列表实际上是一个向量。尝试'is.vector(as.list(1:5))',你会看到结果是'TRUE'。 – Andrie

+0

所以他制作矢量的方式...... :) – John

+3

我认为添加“by = 2”有助于seq(0,10,by = 2)的可读性。 –

5

由于R使用矩阵,所以可以使用标量乘法来修改向量中的每个元素。

> r <-c(0:10) 
> r <- r * 2 
> r 
[1] 0 2 4 6 8 10 12 14 16 18 20 

> r <-c(0:10)*2 
> r 
[1] 0 2 4 6 8 10 12 14 16 18 20 
+1

我认为特别是对于R和新手来说,除非你真的在谈论这些数据类型之一,否则不要抛弃“数组”,“列表”和“矩阵”这两个字。你创建的对象是一个向量。它不是矩阵或数组。 – adamleerich

+0

是的,我滑倒并将矢量称为数组。我的坏 –

+0

如果你想使用':' – useR

3

令我惊讶的是,@ Travis的解决方案速度相当快(4倍)。除非你做的东西真的很大(并且序列生成结果是限制因素),否则我仍然会投票支持seq,因为它更容易阅读。

编辑:正如Marek指出的,seq.int更快。

> library(rbenchmark) # Note spelling: "rbenchmark", not "benchmark" 
> benchmark(seq(0,1e6,by=2),(0:5e5)*2,seq.int(0L,1e6L,by=2L)) 
         test replications elapsed relative user.self sys.self 
2    (0:5e+05) * 2   100 0.587 3.536145  0.344 0.244 
1  seq(0, 1e+06, by = 2)   100 2.760 16.626506  1.832 0.900 
3 seq.int(0, 1000000, by = 2)   100 0.166 1.000000  0.056 0.096 
+0

如果你需要快速解决方案,那么'seq.int(0L,1e6L,by = 2L)' – Marek