Trích xuất mọi phần tử thứ n của một vectơ


126

Tôi muốn tạo một vectơ trong đó mỗi phần tử là i+6thphần tử của vectơ khác.

Ví dụ, trong một vectơ có độ dài 120 tôi muốn tạo một vectơ khác có độ dài 20 trong đó mỗi phần tử là giá trị i, i+6, i+12, i+18...của vectơ ban đầu, tức là tôi muốn trích xuất mọi phần tử thứ 6 của bản gốc.

Câu trả lời:


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

9
Tốt hơn là sử dụng seq.int (1L, chiều dài (a), 6L), ít nhất là cho các vectơ dài
Wojciech Sobala

1
@WojciechSobala Bạn có thể nhận xét tại sao nó tốt hơn không?
dpel

1
@DavidPell seq.intnhanh hơn trong microbenchmark, nhưng tôi nghi ngờ rằng bất kỳ hiệu suất tăng trong một chương trình thực tế sẽ bị lấn át bởi thời gian chạy của các phần khác.
Sean1708

Tôi ghét so sánh Python với R, nhưng PyRon có thể tuyệt vời đến mức nào? a = 1:120; b = [::6]. Python không thể làm cái trước, R không phải cái sau.
bers

44

Một mẹo khác để có được các phần liên tiếp (ngoài giải pháp seq đã được đề cập) là sử dụng một vectơ logic ngắn và sử dụng tái chế vectơ:

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

2
Một lợi thế của phương pháp này là nó có thể được sử dụng tạm thời; để sử dụng, seqbạn phải có khả năng gọi lengthvectơ. letters[letters < 'm'][c(TRUE, FALSE, FALSE)]
Matt Chambers

27

Tôi nghĩ rằng bạn đang hỏi hai điều không nhất thiết phải giống nhau

Tôi muốn trích xuất mọi yếu tố thứ 6 của bản gốc

Bạn có thể làm điều này bằng cách lập chỉ mục một chuỗi:

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

Tôi muốn tạo một vectơ trong đó mỗi phần tử là phần tử i + 6 của một vectơ khác.

Một cách dễ dàng để làm điều này là bổ sung một yếu tố hợp lý với FALSE cho đến khi 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

Thật trơn tru! Tôi cũng đã sử dụng nó theo hướng khác, foo[1:(i+6)!=(i+6)]tức là xuất tất cả các giá trị ngoại trừ thứ sáu.
Fredrik Erlandsson

1

Để chọn mọi phần tử thứ n từ bất kỳ vị trí bắt đầu nào trong vectơ

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.