次のベクトルがあるとします。
x <- c(8, 6, 9, 9, 7, 3, 2, 5, 5, 1, 6, 8, 5, 2, 9, 3, 5, 10, 8, 2)
どの要素が8または9であるかをどのように見つけることができますか?
これはそれを行う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
短い条件で|
演算子を試すことができます
which(x == 8 | x == 9)
この特定のケースでは、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
_は検出されていません。
または、インデックスを使用する必要はなく、要素のみを使用できる場合
> 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次元配列でのみ機能します)。
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