在向量中查找多个元素的所有位置

时间:2009-07-23 03:10:59

标签: r vector r-faq

假设我有以下向量:

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

如何找到哪些元素是8或9?

6 个答案:

答案 0 :(得分:37)

这是一种方法。首先,我得到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

答案 1 :(得分:9)

您可以尝试使用|运算符来处理短期条件

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

答案 2 :(得分:2)

此特定情况下 ,您还可以使用grep

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

两者都给出:

[1]  1  3  4 12 15 19

如果您还想检测多于一个数字的数字,则首选第二个选项:

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

但是,由于某种原因,我确实在回答的开头强调了 此特定情况 As @DavidArenburg mentioned,这可能会导致意外结果。例如,使用grep('1|8',x)将同时检测到110

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

为了避免这种副作用,您必须将要检测的数字包装在单词边界中:

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

现在,未检测到10

答案 3 :(得分:1)

或者,如果您不需要使用索引,只需要使用您可以执行的元素

> 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

答案 4 :(得分: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

答案 5 :(得分:-1)

grepl可能是一个有用的功能。请注意,grepl出现在R 2.9.0及更高版本的版本中。关于grepl的方便之处在于它返回与x长度相同的逻辑向量。

grepl(8, x)
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE

grepl(9, x)
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
[13] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE

要得出答案,您可以执行以下操作

grepl(8,x) | grepl(9,x)