2011-09-07 4 views
28

w R mogę wpisaćR tworzyć listę z przyrostu innych niż 1

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

Jak zrobić listę, która idzie w górę o krokach, które nie jest 1? Na przykład lista liczb parzystych

+4

Założę się, że szybko dostrzeżesz odpowiedź na swoje pytanie, skanując pierwsze kilkanaście wpisów [podręcznika] (http://cran.r-project.org/doc/manuals/R -intro.html). (Podpowiedź: 2.3) – joran

Odpowiedz

50

Komenda seq to robi. Wykonanie seq(1,10,1) robi to, co robi 1:10. Możesz jednak zmienić ostatni parametr na inny, aby mógł wykonać kroki o dowolnym rozmiarze.

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

Na marginesie to, co robisz, jest wektorem, a nie listą. Lista może zawierać wiele zupełnie różnych rodzajów informacji, podczas gdy wektory zawierają te same rodzaje wartości w każdej pozycji indeksu.

+1

+1 Jako dalszy bok, i tylko by zmylić rzeczy, lista jest w rzeczywistości wektorem. Wypróbuj 'is.vector (as.list (1: 5))' a zobaczysz, że wynikiem jest 'TRUE'. – Andrie

+0

więc on robi wektor tak czy inaczej ... :) – John

+3

Myślę, że dodanie "by = 2" pomaga w czytelności dla seq (0, 10, przez = 2). –

5

Ponieważ R używa macierzy, możesz użyć mnożenia skalarnego, aby zmodyfikować każdy element w twoim wektorze.

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

lub

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

Myślę, że szczególnie z R iz nowicjuszami ważne jest, aby nie wyrzucać słów "tablica", "lista" i "matryca", chyba że naprawdę mówisz o jednym z tych typów danych. Obiekt, który utworzyłeś, jest wektorem. Nie jest to macierz ani tablica. – adamleerich

+0

Prawda, poślizgnąłem się i nazwałem wektor tablicą. Moja zła –

+0

'c()' nie jest potrzebna, jeśli chcesz stworzyć wektor używając ':' – useR

3

Ku mojemu zaskoczeniu rozwiązanie @ Travis jest znacznie (4x) szybsze. Jeśli nie robisz czegoś naprawdę wielkiego (a generowanie sekwencji okazuje się czynnikiem ograniczającym), nadal będę głosował na seq jako dużo łatwiejszy do odczytania.

edytuj: jak zaznacza Marek, seq.int jest jeszcze szybszy.

> 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

Jeśli potrzebujesz szybkiego rozwiązania, to 'seq.int (0L, 1e6L, by = 2L)' – Marek

Powiązane problemy