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.