Wyodrębnij każdy n-ty element wektora

126

Chciałbym stworzyć wektor, w którym każdy element jest i+6thelementem innego wektora.

Na przykład w wektorze o długości 120 chcę utworzyć inny wektor o długości 20, w którym każdy element jest wartością i, i+6, i+12, i+18...wektora początkowego, czyli chcę wyodrębnić co szósty element oryginału.

RodgerDodger
źródło

Odpowiedzi:

160
a <- 1:120
b <- a[seq(1, length(a), 6)]
nico
źródło
9
Lepiej jest użyć seq.int (1L, length (a), 6L), przynajmniej dla długich wektorów
Wojciech Sobala
1
@WojciechSobala Czy możesz skomentować, dlaczego jest lepiej?
dpel
1
@DavidPell seq.intjest szybszy w mikroznakach, ale podejrzewam, że jakikolwiek wzrost wydajności w rzeczywistym programie byłby przyćmiony przez czas działania innych części.
Sean1708
Nienawidzę porównywać Pythona z R, ale jak wspaniały mógłby być PyRon? a = 1:120; b = [::6]. Python nie może zrobić tego pierwszego, R nie może zrobić tego drugiego.
bers
44

Inną sztuczką do uzyskania kolejnych elementów (poza wspomnianym już rozwiązaniem sekwencyjnym) jest użycie krótkiego wektora logicznego i wykorzystanie recyklingu wektorów:

foo[ c( rep(FALSE, 5), TRUE ) ]
Greg Snow
źródło
2
Zaletą tego podejścia jest to, że można go używać tymczasowo; aby użyć, seqmusisz mieć możliwość wywołania lengthwektora. letters[letters < 'm'][c(TRUE, FALSE, FALSE)]
Matt Chambers,
27

Myślę, że pytasz o dwie rzeczy, które niekoniecznie są takie same

Chcę wyodrębnić co szósty element oryginału

Możesz to zrobić, indeksując sekwencję:

foo <- 1:120
foo[1:20*6]

Chciałbym stworzyć wektor, w którym każdy element jest i + szóstym elementem innego wektora.

Łatwym sposobem na to jest uzupełnienie czynnika logicznego wartościami FAŁSZ, aż i+6:

foo <- 1:120
i <- 1
foo[1:(i+6)==(i+6)]
[1]   7  14  21  28  35  42  49  56  63  70  77  84  91  98 105 112 119

i <- 10
foo[1:(i+6)==(i+6)]
[1]  16  32  48  64  80  96 112
Sacha Epskamp
źródło
Tak gładko! Użyłem go również w innym kierunku, foo[1:(i+6)!=(i+6)]tj. Wyprowadzam wszystkie wartości z wyjątkiem szóstej.
Fredrik Erlandsson
1

Aby zaznaczyć każdy n-ty element z dowolnej pozycji początkowej w wektorze

nth_element <- function(vector, starting_position, n) { 
  vector[seq(starting_position, length(vector), n)] 
  }

# E.g.
vec <- 1:12

nth_element(vec, 1, 3)
# [1]  1  4  7 10

nth_element(vec, 2, 3)
# [1]  2  5  8 11
stevec
źródło