W R mam element x
i wektor v
. Chcę znaleźć pierwszy indeks elementu, v
który jest równy x
. Wiem, że jednym ze sposobów jest: which(x == v)[[1]]
ale wydaje się to nadmiernie nieefektywne. Czy istnieje bardziej bezpośredni sposób?
Czy w przypadku punktów bonusowych działa funkcja, która x
jest wektorem? Oznacza to, że powinien zwrócić wektor wskaźników wskazujących pozycję każdego elementu x
w v
.
r
indexing
match
vectorization
Ryan C. Thompson
źródło
źródło
which(x == v)[[1]]
nie jest tak bardzo nieefektywny. Jest to jeden==
operator porównania ( ) zastosowany do wszystkich elementów wektorowych i jeden podzbiór indeksów (which
). Otóż to. Nic, co nie powinno być istotne, dopóki nie uruchomisz 10.000 powtórzeń dla tej funkcji. Inne rozwiązania takie jakmatch
iPosition
mogą nie zwracać tylu danychwhich
, ale niekoniecznie są bardziej wydajne.which(x == v)[[1]]
nie jest.Odpowiedzi:
Funkcja
match
działa na wektorach:match
zwraca tylko pierwsze spotkanie z meczu, tak jak prosiłeś. Zwraca pozycję w drugim argumencie wartości w pierwszym argumencie.W przypadku wielokrotnego dopasowywania
%in%
jest to droga:%in%
zwraca wektor logiczny tak długo, jak pierwszy argument, z wartościąTRUE
if można znaleźć w drugim argumencie i wFALSE
przeciwnym razie.źródło
match
znaczenie, jeśli chcesz indeks pierwszego wystąpienia. Na przykładmatch(x,c(4,8))
daje różne wyniki, co na początku nie jest zbyt oczywiste.match
. Wszystko jest tam wyjaśnione. Ale dodałem tę informację.funkcja
Position
w funprog {base} również wykonuje tę pracę. Pozwala przekazać dowolną funkcję i zwraca pierwsze lub ostatnie dopasowanie.Position(f, x, right = FALSE, nomatch = NA_integer)
źródło
Mała uwaga na temat skuteczności wyżej wymienionych metod:
Więc najlepszy jest
źródło
which("Feb" == month.abb)
zwraca -2
dlaczego[[1]]
?which(x == v)[[1]]
, ., Ale to wydaje się nadmiernie nieefektywne”R przeciążył
==
operatora podwójnej równości metodą wyszukiwania indeksu igły w wektorowym stogu siana. Dajelogical
wektor zawierającyTRUE
wartości dla każdego dopasowania w stogu siana.Przykład:
Działa, jeśli oba są wektorami, i można je rozszerzyć, aby używały również wielu wektorów.
źródło
==
Operator już wspomniano w moje pytanie jako nieefektywnego rozwiązania, które nie działa z wektorem igieł.FALSE FALSE TRUE FALSE TRUE
zamiast wskaźników w tym przykładzie==
Zwraca wektor logiczny, a nie indeksy. Do tego potrzebujeszwhich()
, jak wyjaśniłem 7 lat temu.