Извлечь каждый n-й элемент вектора


127

Я хотел бы создать вектор, в котором каждый элемент является i+6thэлементом другого вектора.

Например, в векторе длиной 120 я хочу создать другой вектор длиной 20, в котором каждый элемент является значением i, i+6, i+12, i+18...исходного вектора, т.е. я хочу извлечь каждый 6-й элемент оригинала.

Ответы:


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

9
Лучше использовать seq.int (1L, length (a), 6L), по крайней мере, для длинных векторов
Войцех Собала 08

1
@WojciechSobala Не могли бы вы прокомментировать, почему это лучше?
dpel

1
@DavidPell seq.intработает быстрее в микробенчмарках, но я подозреваю, что любое повышение производительности в реальной программе будет затмевается временем работы других частей.
Sean1708,

Ненавижу сравнивать Python с R, но насколько хорош PyRon? a = 1:120; b = [::6], Python не может сделать первое, а R - второе.
bers

44

Еще одна уловка для получения последовательных частей (помимо уже упомянутого решения seq) - использовать короткий логический вектор и использовать повторное использование вектора:

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

2
Преимущество этого подхода в том, что его можно использовать временно; для использования seqвы должны иметь возможность вызывать lengthвектор. letters[letters < 'm'][c(TRUE, FALSE, FALSE)]
Мэтт Чемберс

27

Я думаю, вы спрашиваете о двух вещах, которые не обязательно совпадают

Я хочу извлечь каждый шестой элемент оригинала

Вы можете сделать это, проиндексировав последовательность:

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

Я хотел бы создать вектор, в котором каждый элемент является i + 6-м элементом другого вектора.

Легкий способ сделать это - добавить в логический фактор ЛОЖЬ до тех пор, пока 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

Так здорово! Я использовал его и в другом направлении, foo[1:(i+6)!=(i+6)]т.е. выводил все значения, кроме шестого.
Фредрик Эрландссон

1

Чтобы выбрать каждый n-й элемент из любой начальной позиции в векторе

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.