Поиск всех позиций для нескольких элементов в векторе

r vector r-faq

36501 просмотра

5 ответа

19554 Репутация автора

Предположим, у меня есть следующий вектор:

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

Как я могу найти, какие элементы 8 или 9?

Автор: Christopher DuBois Источник Размещён: 23.07.2009 03:10

Ответы (5)


38 плюса

19554 Репутация автора

Решение

Это один из способов сделать это. Сначала я получаю индексы, при которых х равен 8 или 9. Затем мы можем проверить, что при этих индексах х действительно 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
Автор: Christopher DuBois Размещён: 23.07.2009 03:13

1 плюс

195 Репутация автора

В качестве альтернативы, если вам не нужно использовать индексы, а только элементы, которые вы можете сделать

> 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
Автор: Yann Abraham Размещён: 23.07.2009 07:34

9 плюса

0 Репутация автора

Вы можете попробовать |оператора на короткие сроки

which(x == 8 | x == 9)
Автор: mdsumner Размещён: 23.07.2009 01:10

-1 плюса

1470 Репутация автора

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)
Автор: andrewj Размещён: 26.07.2009 06:26

2 плюса

60496 Репутация автора

В этом конкретном случае вы также можете использовать 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

Тем не менее, я сделал акцент на этом конкретном случае в начале моего ответа по причине. Как отметил @DavidArenburg , это может привести к непредвиденным результатам. Использование, например 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не обнаружено.

Автор: Jaap Размещён: 17.08.2018 08:08
Вопросы из категории :
32x32