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.

Jawaban:


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

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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.