czasami zadaję sobie pytanie, dlaczego R po prostu nie używa słowa zawiera, aby ułatwić użytkownikom
greg121
12
rozważ, że „in” jest zawarte w „conta (in) s”; Twierdziłbym, że „in” jest w tym kontekście dość zwięzłym konkurentem
hedgedandleught
1
Być może po dodaniu %znaków flankujących . To słowo injest zarezerwowane w języku R do użycia w konstrukcji pętli.
IRTFM,
@ greg121 dplyr ma już funkcję zawierającą , ale jest używana do innego celu: do wybrania kolumny w ramce danych. Na przykład select(iris, contains("etal")).
Paul Rougieux
Czy istnieje zwięzły sposób na wykonanie liczb rzeczywistych z określoną precyzją?
mlt
Odpowiedzi:
500
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
Wiem, że dokumentacja mówi is.element(x, y) is identical to x %in% y. Ale nie wiem dlaczego, is.elementsdziała podczas mieszania liczb całkowitych i liczbowych i %in%nie robi
pomber
@pomber: Czy możesz podać przykład tego?
discipulus
@pomber jest naprawiony?
vasili111
2
Doskonała czytelność 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 fruitma sens, fruit in applenie ma. is.element(apple, fruit)lub is.element(fruit, apple)oba mogą mieć rację w zależności od implementacji is.elementfunkcji.
rileymcdowell
70
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]24
Aby znaleźć wszystkie wystąpienia jako wektor logiczny :
==
>'a'== v
[1]FALSETRUEFALSETRUEFALSE
Edycja: Usunięcie grep () i grepl () z listy z powodów wymienionych w komentarzach
whichjest 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/...
Fizz
2
Po co męczyć się, whichjeśli chcesz znaleźć elementy, których nie ma Tset? Możesz po prostu indeksować popbezpośrednio; pop[!pop%in%Tset]
Houshalter,
13
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]34
grepl () zwraca logiczny wektor z „PRAWDA” w miejscu dopasowania.
yo <- c("a","a","b","b","c","c")
grepl("b", yo)[1]FALSEFALSETRUETRUEFALSEFALSE
Domyślnie grepjako pierwszy element przyjmuje wyrażenie regularne, więc aby dokładnie dopasować "b", użyj ^e$lub dodaj , fixed=TRUE).
reinierpost
10
Nie używaj wyrażenia regularnego dla dokładnych dopasowań. Jest to niebezpieczne i może mieć nieoczekiwane wyniki
David Arenburg,
9
Tak, to okropny, niezbyt dobry, bardzo zły pomysł - nieefektywny i gwarantujący złamanie. Np. myvar <- 'blah'; grepl('b', myvar, fixed=TRUE)Powróci, TRUEmimo że „b” nie jest w myvar.
%
znaków flankujących . To słowoin
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ą).źródło
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 logiczneis.element()
sprawia, że kod jest bardziej czytelny i jest identyczny z%in%
źródło
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 robiis.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)
lubis.element(fruit, apple)
oba mogą mieć rację w zależności od implementacjiis.element
funkcji.Zgrupuję opcje na podstawie danych wyjściowych. Załóżmy następujący wektor dla wszystkich przykładów.
Aby sprawdzić obecność:
%w%
każdy()
is.element ()
Aby znaleźć pierwsze wystąpienie:
mecz()
Aby znaleźć wszystkie wystąpienia jako wektor wskaźników:
który()
Aby znaleźć wszystkie wystąpienia jako wektor logiczny :
==
Edycja: Usunięcie grep () i grepl () z listy z powodów wymienionych w komentarzach
źródło
grep()
ani wyrażeń regularnych, aby znaleźć dokładne dopasowania.Funkcja any () zapewnia czytelny kod
źródło
%in%
:any(1==NA)
zwracaNA
, gdzie1 %in% NA
zwracaFALSE
.any(1==NA, na.rm=TRUE)
zwracaFALSE
.Możesz użyć
%in%
operatora:źródło
Również, aby znaleźć pozycję elementu „który” można wykorzystać jako
i aby znaleźć elementy, które nie są zawarte w wektorze docelowym, można to zrobić:
źródło
which
jest czasem preferowane, ponieważ daje ci wszystkie pasujące pozycje (jako tablicę), w przeciwieństwie domatch
. 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 maTset
? 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.
grepl () zwraca logiczny wektor z „PRAWDA” w miejscu dopasowania.
W funkcjach tych rozróżniana jest wielkość liter.
źródło
grep
jako pierwszy element przyjmuje wyrażenie regularne, więc aby dokładnie dopasować"b"
, użyj^e$
lub dodaj, fixed=TRUE
).myvar <- 'blah'; grepl('b', myvar, fixed=TRUE)
Powróci,TRUE
mimo że „b” nie jest wmyvar
.