Как получить каждую третью запись из вектора?

#r #vector

#r #вектор

Вопрос:

У меня есть вектор:

 > dput(rn, 20)
c(128L, 241L, 354L, 467L, 580L, 693L, 806L, 919L, 1032L, 1145L, 
1258L, 1371L, 1484L, 1597L, 1710L, 1823L, 1936L, 2049L, 2162L, 
2275L)
  

Как мне получить каждую третью запись из этого вектора?

Ответ №1:

Пусть переработка делает это волшебно.

 rn[c(FALSE, FALSE, TRUE)]
  

хотя это (и все другие ответы, я думаю) не удается length(rn) < 3 . Может быть

 rn[3L * seq_len(length(rn)/3L)]
  

Ответ №2:

Используется seq для создания последовательности индексных номеров:

 > rn[seq(3, 20, 3)]
[1]  354  693 1032 1371 1710 2049
  

Это работает, потому seq что генерирует следующую последовательность:

 seq(from=3, to=20, by=3)
[1]  3  6  9 12 15 18
  

В более общем плане, если вы не знаете длину своего вектора заранее, вы можете вычислить его с помощью length :

 seq(from=3, to=length(rn), by=3)
[1]  3  6  9 12 15 18
  

Смотрите ?seq для получения дополнительной справки.

Комментарии:

1. Ха-ха… мы определенно находимся в какой-то синхронизации R-вопросов и ответов. 1 за то, что опередил меня на несколько секунд (и проклинает ограничение в 30 символов)!

Ответ №3:

rn[seq(3,length(rn),3)] # 30 chars

Ответ №4:

Может тебе нравится это?

 > x <- c(128L, 241L, 354L, 467L, 580L, 693L, 806L, 919L, 1032L, 1145L, 
  1258L, 1371L, 1484L, 1597L, 1710L, 1823L, 1936L, 2049L, 2162L, 
  2275L)
> 
> x[seq(3, length(x), 3)]
[1]  354  693 1032 1371 1710 2049
  

Ответ №5:

seq() само по себе делает приятные вещи: x[seq(x)%%3==0] сделает свое дело. Технически x[seq_along(x)%%3==0] это быстрее, но большую часть времени вам будет все равно.

Например,

 > letters[seq(letters)%%3==0]
[1] "c" "f" "i" "l" "o" "r" "u" "x"