Ekstrak setiap elemen ke-n vektor

126

Saya ingin membuat vektor di mana setiap elemen adalah i+6thelemen dari vektor lain.

Misalnya, dalam vektor dengan panjang 120, saya ingin membuat vektor panjang 20 di mana setiap elemen adalah nilai i, i+6, i+12, i+18...dari vektor awal, yaitu saya ingin mengekstrak setiap elemen ke-6 dari dokumen asli.

RodgerDodger
sumber

Jawaban:

160
a <- 1:120
b <- a[seq(1, length(a), 6)]
nico
sumber
9
Lebih baik menggunakan seq.int (1L, panjang (a), 6L), setidaknya untuk vektor yang panjang
Wojciech Sobala
1
@WojciechSobala Bisakah Anda berkomentar mengapa lebih baik?
dpel
1
@ DavidvidPel seq.intlebih cepat dalam microbenchmark, tapi saya menduga bahwa setiap peningkatan kinerja dalam program yang sebenarnya akan dikerdilkan oleh waktu berjalan bagian lain.
Sean1708
Saya benci membandingkan Python dengan R, tapi seberapa hebat PyRon? a = 1:120; b = [::6]. Python tidak bisa melakukan yang pertama, R bukan yang terakhir.
bers
44

Trik lain untuk mendapatkan potongan sekuensial (di luar solusi seq yang telah disebutkan) adalah menggunakan vektor logis pendek dan menggunakan daur ulang vektor:

foo[ c( rep(FALSE, 5), TRUE ) ]
Greg Snow
sumber
2
Keuntungan dari pendekatan ini adalah dapat digunakan untuk sementara; untuk menggunakan seqAnda harus dapat memanggil lengthvektor. letters[letters < 'm'][c(TRUE, FALSE, FALSE)]
Matt Chambers
27

Saya pikir Anda menanyakan dua hal yang belum tentu sama

Saya ingin mengekstrak setiap elemen keenam dari yang asli

Anda dapat melakukan ini dengan mengindeks urutan:

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

Saya ingin membuat vektor di mana setiap elemen adalah elemen i + 6 dari vektor lain.

Cara mudah untuk melakukan ini adalah menambah faktor logis dengan SALAH sampai 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
sumber
Sangat licin! Saya sudah menggunakannya ke arah lain juga, foo[1:(i+6)!=(i+6)]yaitu output semua nilai kecuali keenam.
Fredrik Erlandsson
1

Untuk memilih setiap elemen ke-n dari setiap posisi awal dalam 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
sumber