Estrai ogni ennesimo elemento di un vettore


126

Vorrei creare un vettore in cui ogni elemento è l' i+6thelemento di un altro vettore.

Ad esempio, in un vettore di lunghezza 120 voglio creare un altro vettore di lunghezza 20 in cui ogni elemento è il valore i, i+6, i+12, i+18...del vettore iniziale, cioè voglio estrarre ogni 6 ° elemento dell'originale.

Risposte:


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

9
È meglio usare seq.int (1L, lunghezza (a), 6L), almeno per i vettori lunghi
Wojciech Sobala

1
@WojciechSobala Potresti commentare perché è meglio?
Dpel,

1
@DavidPell seq.intè più veloce nei microbenchmark, ma ho il sospetto che qualsiasi aumento delle prestazioni in un programma reale sarebbe sminuito dal tempo di esecuzione di altre parti.
Sean1708,

Odio confrontare Python con R, ma quanto potrebbe essere bello PyRon? a = 1:120; b = [::6]. Python non può fare il primo, R non il secondo.
bers

44

Un altro trucco per ottenere pezzi sequenziali (oltre alla soluzione seq già menzionata) è usare un breve vettore logico e usare il riciclaggio dei vettori:

foo[ c( rep(FALSE, 5), TRUE ) ]

2
Un vantaggio di questo approccio è che può essere utilizzato in modo temporaneo; per poter usare seqdevi essere in grado di chiamare lengthil vettore. letters[letters < 'm'][c(TRUE, FALSE, FALSE)]
Matt Chambers,

27

Penso che stai chiedendo due cose che non sono necessariamente le stesse

Voglio estrarre ogni 6 ° elemento dell'originale

Puoi farlo indicizzando una sequenza:

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

Vorrei creare un vettore in cui ogni elemento è l'i + 6 ° elemento di un altro vettore.

Un modo semplice per farlo è integrare un fattore logico con FALSE fino a quando 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

Così elegante! L'ho usato anche nell'altra direzione, foo[1:(i+6)!=(i+6)]ovvero in uscita tutti i valori tranne il sesto.
Fredrik Erlandsson,

1

Per selezionare ogni ennesimo elemento da qualsiasi posizione iniziale nel vettore

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.