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.