0

> 5 で、10 番目の位置の後にある x の数は? それは 11 番目の数字です。しかし、答えを得るために長いコードを書いていることに気づきました。もっと速い方法があるかどうか疑問に思っています。

x <- c(5,7,3,6,9,4,1,4,7,10,8,5,7,9,7,1, 8, 4, 4,9);

5 を超えるすべての数字の位置を特定し、それを x1 と呼びます。

x1 <- which(x>5);

10 番目の位置の後に発生した場所の最初の数 (x1) を特定します。

first(which(x1 >10))

これは x1 の位置 6 を識別します。

元のベクトル (x) 内のその数値の位置を特定します。

x1[first(which(x1 >10))]; 

これで、元のベクトル (x) で必要な値の位置が得られました。このコードは、必要な値を取得します。

x[x1[first(which(x1 >10))]]

これは、単純な質問に答えるには非常に長いコードのように思えます。同じ結果を得るためのより短い/簡単な方法を知っていますか?

4

2 に答える 2

4

非常に単純な索引付けとサブセット化の何が問題になっているのでしょうか?

xこれは、 5 より大きく、 position の後にあるすべての要素のインデックスを返します10

> which(x > 5 & seq_along(x) > 10)
[1] 11 13 14 15 17 20

だから究極の答えは

> which(x > 5 & seq_along(x) > 10)[1]
[1] 11

また

> head(which(x > 5 & seq_along(x) > 10), 1)
[1] 11

ここで使用されるトリックは、関数をx使用してインデックスのベクトルを生成することです。seq_along()そうすれば、単一の論理ステートメントですべての一致を生成し、これらの最初のものを選択できます。

特定された要素を抽出する場合は、次のようにします。

> want <- which(x > 5 & seq_along(x) > 10)[1]
> x[want]
[1] 8

[どの要素が基準を満たすのか、それともその要素の値を特定したいのか明確ではありませんでした。]

于 2013-03-01T04:15:01.760 に答える
1

関数型プログラミングを使用してインデックスを抽出する代替バージョン:

> Find(function(y) x[y] > 5 & y > 10, seq_along(x))
[1] 11

または要素を抽出するには:

> x[Find(function(y) x[y] > 5 & y > 10, seq_along(x))]
[1] 8

ただし、単純なインデックス付けと比較したパフォーマンスの違いについてはわかりません。

于 2013-03-01T10:07:11.033 に答える