2011-09-07 51 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