Znajdowanie wszystkich pozycji dla wielu elementów w wektorze

Załóżmy, że mam następujący wektor:

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

Jak mogę znaleźć, które elementy są albo 8 lub 9?

Author: Jaap, 2009-07-23

5 answers

To jest jeden sposób, aby to zrobić. Najpierw dostaję indeksy, przy których x jest albo 8, albo 9. Następnie możemy zweryfikować, że przy tych indeksach X jest rzeczywiście 8 i 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
 34
Author: Christopher DuBois,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-23 03:13:38

Możesz wypróbować operator | na krótkie Warunki

which(x == 8 | x == 9)
 9
Author: David Arenburg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-09 20:27:02

W ten szczególny przypadek możesz również użyć grep:

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

Które dają:

[1]  1  3  4 12 15 19

Jeśli chcesz również wykryć liczbę z więcej niż jedną cyfrą, preferowana jest druga opcja:

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

Jednak położyłem nacisk na ten szczególny przypadek na początku mojej odpowiedzi nie bez powodu. jak wspomniał @DavidArenburg , może to prowadzić do niezamierzonych rezultatów. Użycie na przykład grep('1|8',x) wykryje zarówno 1, jak i 10:

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

Aby uniknąć tego efektu ubocznego, musisz zawinąć liczby, które mają być wykryte w Word-bounderies:

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

Teraz, 10 nie jest wykryty.

 2
Author: Jaap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-17 10:04:28

Alternatywnie, jeśli nie musisz używać indeksów, ale tylko elementów, które możesz zrobić

> 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
Author: Yann Abraham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-23 07:34:45

grepl może przydatna funkcja. Zauważ, że grepl pojawia się w wersjach R 2.9.0 i późniejszych. Przydatne w grepl jest to, że zwraca wektor logiczny o tej samej długości co 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
Aby uzyskać odpowiedź, możesz wykonać następujące czynności]}
grepl(8,x) | grepl(9,x)
 -1
Author: andrewj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-15 14:16:52