web-dev-qa-db-ja.com

ベクトル内でXより大きい最初の値の位置を見つける

R:ベクトルがあり、100より大きい最初の値の位置を見つけたい。

19
curbholes
# Randomly generate a suitable vector
set.seed(0)
v <- sample(50:150, size = 50, replace = TRUE)

min(which(v > 100))
29
Phil

whichおよびmaxに基づくほとんどの回答は、entireベクトルを反復処理するため低速です(特に長いベクトルの場合)。 :

  1. x>100は、条件に一致するかどうかを確認するために、ベクトルのevery値を評価します
  2. whichおよびmax/min searchallステップ1で返されたインデックスを検索し、最大/最小

Positionは、最初のTRUE値に遭遇するまで条件を評価し、残りのベクトルを継続せずに、対応するインデックスをすぐに返します。

# Randomly generate a suitable vector
v <- sample(50:150, size = 50, replace = TRUE)

Position(function(x) x > 100, v)
23
Ant

チェックアウト which.max

x <- seq(1, 150, 3)
which.max(x > 100)
# [1] 35
x[35]
# [1] 103
12
lukeA

ちょうど言及するために、Hadley Wickhamは、関数プログラミングのためのpurrrパッケージでこのタスクを正確に行うための関数detect_indexを実装しました。

私は最近detect_indexを自分で使用しましたが、同じ問題を抱えている他の人にもお勧めします。

detect_indexのドキュメントはここにあります: https://rdrr.io/cran/purrr/man/detect.html

5
Chill2Macht

多くの解決策がありますが、もう1つは次のとおりです。

x <- 90:110
which(x > 100)[1]
0
Jeff