web-dev-qa-db-ja.com

ベクトル内の複数の要素のすべての位置を検索する

次のベクトルがあるとします。

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

どの要素が8または9であるかをどのように見つけることができますか?

21

これはそれを行う1つの方法です。最初に、xが8または9のいずれかであるインデックスを取得します。次に、これらのインデックスで、xが実際に8および9であることを確認できます。

> inds <- which(x %in% c(8,9))
> inds
[1]  1  3  4 12 15 19
> x[inds]
[1] 8 9 9 8 9 8
38

短い条件で|演算子を試すことができます

which(x == 8 | x == 9)
10
mdsumner

この特定のケースでは、grepを使用することもできます。

_# option 1
grep('[89]',x)
# option 2
grep('8|9',x)
_

両方が与える:

_[1]  1  3  4 12 15 19
_

複数の数字を含む数字も検出する場合は、2番目のオプションをお勧めします。

_> grep('10|8',x)
[1]  1 12 18 19
_

しかし、私は理由のために私の答えの始めにこの特定のケースに重点を置きました。 @ DavidArenburgが述べたように 、これは意図しない結果につながる可能性があります。たとえば、grep('1|8',x)を使用すると、_1_と_10_の両方が検出されます。

_> grep('1|8',x)
[1]  1 10 12 18 19
_

この副作用を回避するには、Wordの境界で検出される数値をラップする必要があります。

_> grep('\\b1\\b|8',x)
[1]  1 10 12 19
_

現在、_10_は検出されていません。

2
Jaap

または、インデックスを使用する必要はなく、要素のみを使用できる場合

> x <- sample(1:10,20,replace=TRUE)
> x
 [1]  6  4  7  2  9  3  3  5  4  7  2  1  4  9  1  6 10  4  3 10
> x[8<=x & x<=9]
[1] 9 9
1
Yann Abraham

これは、すべてのターゲット値の位置を見つけるための一般化されたソリューションです(ベクトルと1次元配列でのみ機能します)。

locate <- function(x, targets) {
    results <- lapply(targets, function(target) which(x == target))
    names(results) <- targets
    results
}

各ターゲットにはゼロを含む任意の数の一致がある可能性があるため、この関数はリストを返します。リストは、ターゲットの元の順序でソート(および名前付け)されます。

使用例を次に示します。

sequence <- c(1:10, 1:10)

locate(sequence, c(2,9))
$`2`
[1]  2 12

$`9`
[1]  9 19
0
user3474009