Jak sprawdzić, czy wektor zawiera daną wartość?
%
znaków flankujących . To słowo in
jest zarezerwowane w języku R do użycia w konstrukcji pętli.
select(iris, contains("etal"))
.
Jak sprawdzić, czy wektor zawiera daną wartość?
%
znaków flankujących . To słowo in
jest zarezerwowane w języku R do użycia w konstrukcji pętli.
select(iris, contains("etal"))
.
Odpowiedzi:
Służą do tego zarówno funkcje match()
(zwraca pierwszy wygląd), jak i %in%
(zwraca wartość logiczną).
v <- c('a','b','c','e')
'b' %in% v
## returns TRUE
match('b',v)
## returns the first location of 'b', in this case: 2
which(v, 'b')
. Zwróć uwagę na kolejność argumentów.
which(v, 'b')
wyskakuje mi komunikat o błędzie:> Błąd w którym (v, „b”): argument „która” nie jest logiczne
is.element()
sprawia, że kod jest bardziej czytelny i jest identyczny z %in%
v <- c('a','b','c','e')
is.element('b', v)
'b' %in% v
## both return TRUE
is.element('f', v)
'f' %in% v
## both return FALSE
subv <- c('a', 'f')
subv %in% v
## returns a vector TRUE FALSE
is.element(subv, v)
## returns a vector TRUE FALSE
is.element(x, y) is identical to x %in% y
. Ale nie wiem dlaczego, is.elements
działa podczas mieszania liczb całkowitych i liczbowych i %in%
nie robi
is.element()
vs %in%
jest subiektywna. Można stwierdzić, że operator poprawki jest bardziej czytelny, ponieważ eliminuje niejednoznaczność w kolejności argumentów. apple in fruit
ma sens, fruit in apple
nie ma. is.element(apple, fruit)
lub is.element(fruit, apple)
oba mogą mieć rację w zależności od implementacji is.element
funkcji.
Zgrupuję opcje na podstawie danych wyjściowych. Załóżmy następujący wektor dla wszystkich przykładów.
v <- c('z', 'a','b','a','e')
Aby sprawdzić obecność:
%w%
> 'a' %in% v
[1] TRUE
każdy()
> any('a'==v)
[1] TRUE
is.element ()
> is.element('a', v)
[1] TRUE
Aby znaleźć pierwsze wystąpienie:
mecz()
> match('a', v)
[1] 2
Aby znaleźć wszystkie wystąpienia jako wektor wskaźników:
który()
> which('a' == v)
[1] 2 4
Aby znaleźć wszystkie wystąpienia jako wektor logiczny :
==
> 'a' == v
[1] FALSE TRUE FALSE TRUE FALSE
Edycja: Usunięcie grep () i grepl () z listy z powodów wymienionych w komentarzach
Funkcja any () zapewnia czytelny kod
> w <- c(1,2,3)
> any(w==1)
[1] TRUE
> v <- c('a','b','c')
> any(v=='b')
[1] TRUE
> any(v=='f')
[1] FALSE
any(1==NA, na.rm=TRUE)
zwraca FALSE
.
Również, aby znaleźć pozycję elementu „który” można wykorzystać jako
pop <- c(3,4,5,7,13)
which(pop==13)
i aby znaleźć elementy, które nie są zawarte w wektorze docelowym, można to zrobić:
pop <- c(1,2,4,6,10)
Tset <- c(2,10,7) # Target set
pop[which(!(pop%in%Tset))]
which
jest czasem preferowane, ponieważ daje ci wszystkie pasujące pozycje (jako tablicę), w przeciwieństwie do match
. Chociaż być może nie o to poprosił OP, w przeciwieństwie do stackoverflow.com/questions/1169388/...
which
jeśli chcesz znaleźć elementy, których nie ma Tset
? Możesz po prostu indeksować pop
bezpośrednio; pop[!pop%in%Tset]
W tym celu naprawdę lubię grep () i grepl ().
grep () zwraca wektor liczb całkowitych, które wskazują, gdzie są dopasowania.
yo <- c("a", "a", "b", "b", "c", "c")
grep("b", yo)
[1] 3 4
grepl () zwraca logiczny wektor z „PRAWDA” w miejscu dopasowania.
yo <- c("a", "a", "b", "b", "c", "c")
grepl("b", yo)
[1] FALSE FALSE TRUE TRUE FALSE FALSE
W funkcjach tych rozróżniana jest wielkość liter.
grep
jako pierwszy element przyjmuje wyrażenie regularne, więc aby dokładnie dopasować "b"
, użyj ^e$
lub dodaj , fixed=TRUE
).