ベクトルのn番目ごとの要素を抽出する


126

各要素がi+6th別のベクトルの要素であるベクトルを作成したいと思います。

たとえば、長さ120のベクトルで、各要素がi, i+6, i+12, i+18...初期ベクトルの値である長さ20の別のベクトルを作成したい。つまり、元の要素の6番目ごとの要素を抽出したい。

回答:


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

9
少なくとも長いベクトルにはseq.int(1L、length(a)、6L)を使用することをお勧めします
Wojciech Sobala

1
@WojciechSobalaなぜそれが良いのかコメントいただけますか?
dpel、2016年

1
@DavidPell seq.intはマイクロベンチマークでより高速ですが、実際のプログラムでのパフォーマンスの向上は、他の部分の実行時間によって小さくなります。
Sean1708

PythonとRを比較したくないのですが、PyRonはどれほど優れているのでしょうか。a = 1:120; b = [::6]。Pythonは前者を実行できず、Rは後者を実行できません。
ビール

44

(すでに述べたseqソリューションを超えて)連続したピースを取得するためのもう1つのトリックは、短い論理ベクトルを使用し、ベクトルのリサイクルを使用することです。

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

2
このアプローチの利点は、一時的に使用できることです。使用seqするにはlength、ベクターを呼び出すことができる必要があります。letters[letters < 'm'][c(TRUE, FALSE, FALSE)]
Matt Chambers

27

必ずしも同じではない2つのことを尋ねていると思います

オリジナルの6番目ごとの要素を抽出したい

これを行うには、シーケンスにインデックスを付けます。

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

各要素が別のベクトルのi + 6番目の要素であるベクトルを作成したいと思います。

これを行う簡単な方法は、次の状態になるまで論理要素にFALSEを追加すること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)]。つまり、6番目以外のすべての値を出力します。
Fredrik Erlandsson 2013年

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.