Витягуємо кожен n-й елемент вектора


126

Я хотів би створити вектор, у якому кожен елемент є i+6thелементом іншого вектора.

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

Відповіді:


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

9
Краще використовувати seq.int (1L, довжина (a), 6L), принаймні для довгих векторів
Войцех Собала

1
@WojciechSobala Чи можете ви прокоментувати, чому це краще?
dpel

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

Я ненавиджу порівнювати Python з R, але наскільки великим може бути PyRon? a = 1:120; b = [::6]. Python не може робити перше, R не останнє.
Берс

44

Ще один трюк для отримання послідовних фрагментів (крім вже згаданого рішення послідовності) - використовувати короткий логічний вектор та використовувати векторну переробку:

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

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

27

Я думаю, ви запитуєте дві речі, які не обов'язково однакові

Я хочу витягти кожен 6-й елемент оригіналу

Це можна зробити, індексуючи послідовність:

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.