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.

Antworten:


160
a <- 1:120
b <- a[seq(1, length(a), 6)]

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 ) ]

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.