Extrahieren Sie jedes n-te Element eines Vektors

126

Ich möchte einen Vektor erstellen, in dem jedes Element das i+6thElement eines anderen Vektors ist.

Zum Beispiel möchte ich in einem Vektor der Länge 120 einen anderen Vektor der Länge 20 erzeugen, in dem jedes Element der Wert i, i+6, i+12, i+18...des Anfangsvektors ist, dh ich möchte jedes 6. Element des Originals extrahieren.

RodgerDodger
quelle

Antworten:

160
a <- 1:120
b <- a[seq(1, length(a), 6)]
nico
quelle
9
Es ist besser, seq.int (1L, Länge (a), 6L) zu verwenden, zumindest für lange Vektoren
Wojciech Sobala
1
@WojciechSobala Könnten Sie kommentieren, warum es besser ist?
dpel
1
@DavidPell seq.intist in Mikrobenchmarks schneller, aber ich vermute, dass Leistungssteigerungen in einem tatsächlichen Programm durch die Laufzeit anderer Teile in den Schatten gestellt würden.
Sean1708
Ich hasse es, Python mit R zu vergleichen, aber wie großartig könnte PyRon sein? a = 1:120; b = [::6]. Python kann das erstere nicht, R nicht das letztere.
Bers
44

Ein weiterer Trick, um sequentielle Teile zu erhalten (über die bereits erwähnte seq-Lösung hinaus), besteht darin, einen kurzen logischen Vektor zu verwenden und das Vektorrecycling zu verwenden:

foo[ c( rep(FALSE, 5), TRUE ) ]
Greg Snow
quelle
2
Ein Vorteil dieses Ansatzes besteht darin, dass er vorübergehend verwendet werden kann. Um verwenden seqzu können, müssen Sie in der Lage sein, lengthden Vektor aufzurufen . letters[letters < 'm'][c(TRUE, FALSE, FALSE)]
Matt Chambers
27

Ich denke, Sie fragen zwei Dinge, die nicht unbedingt gleich sind

Ich möchte jedes sechste Element des Originals extrahieren

Sie können dies tun, indem Sie eine Sequenz indizieren:

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

Ich möchte einen Vektor erstellen, in dem jedes Element das i + 6. Element eines anderen Vektors ist.

Eine einfache Möglichkeit, dies zu tun, besteht darin, einen logischen Faktor mit FALSEs zu ergänzen, bis 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
quelle
So schlau! Ich habe es auch in die andere Richtung verwendet, foo[1:(i+6)!=(i+6)]dh alle Werte außer dem sechsten ausgegeben.
Fredrik Erlandsson
1

Auswahl jedes n-ten Elements aus einer beliebigen Startposition im Vektor

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
quelle