假设我有以下向量:
x <- c(8, 6, 9, 9, 7, 3, 2, 5, 5, 1, 6, 8, 5, 2, 9, 3, 5, 10, 8, 2)
如何找到哪些元素是8或9?
答案 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)
将同时检测到1
和10
:
> 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)