Istnieją pewne problemy, gdy wektor logiczny zawiera NA
wartości.
Zobacz na przykład:
z <- c(TRUE, FALSE, NA)
sum(z) # gives you NA
table(z)["TRUE"] # gives you 1
length(z[z == TRUE]) # f3lix answer, gives you 2 (because NA indexing returns values)
Myślę więc, że najbezpieczniej jest użyć na.rm = TRUE
:
sum(z, na.rm = TRUE) # best way to count TRUE values
(co daje 1). Myślę, że to table
rozwiązanie jest mniej wydajne (spójrz na kod table
funkcji).
Należy również zachować ostrożność przy rozwiązaniu „tabelowym”, na wypadek gdyby w wektorze logicznym nie było wartości TRUE. Załóżmy z <- c(NA, FALSE, NA)
lub po prostu z <- c(FALSE, FALSE)
, a następnie table(z)["TRUE"]
podaje NA
dla obu przypadków.
table(c(FALSE))["TRUE"]
daje NA, a nie 0.sum(z, na.rm = TRUE)
Inną opcją, o której nie wspomniano, jest użycie
which
:Aby rzeczywiście podać kontekst na pytanie „które jest szybsze”, zawsze najłatwiej jest po prostu sprawdzić siebie. Zrobiłem wektor znacznie większy dla porównania:
Dlatego
sum
w tym przypadku najlepszym podejściem jest użycie . Możesz także chcieć sprawdzićNA
wartości, jak zasugerował Marek.Wystarczy dodać uwagę dotyczącą wartości NA i
which
funkcji:Zwróć uwagę, że sprawdza tylko logikę
TRUE
, więc zasadniczo ignoruje wartości nielogiczne.źródło
Innym sposobem jest
Chociaż
sum(z)
jest ładne i krótkie, dla mnielength(z[z==TRUE])
jest bardziej zrozumiałe. Chociaż myślę, że w przypadku prostego zadania takiego jak to nie ma to większego znaczenia ...Jeśli jest to duży wektor, prawdopodobnie powinieneś wybrać najszybsze rozwiązanie, czyli
sum(z)
.length(z[z==TRUE])
jest około 10x wolniejszy itable(z)[TRUE]
około 200x wolniejszy niżsum(z)
.Podsumowując,
sum(z)
jest najszybszy do wpisania i wykonania.źródło
which
jest dobrą alternatywą, zwłaszcza gdy operujesz na macierzach (sprawdź?which
i zwróć uwagę naarr.ind
argument). Ale proponuję, żebyś się trzymałsum
, ponieważna.rm
argument, który może obsłużyćNA
w wektorze logicznym. Na przykład:Jeśli wpiszesz
sum(x)
dostanieszNA
wyniku, ale jeśli przejdziena.rm = TRUE
wsum
funkcję, otrzymasz wynik, który chcesz.Czy twoje pytanie jest stricte teoretyczne, czy też masz jakiś praktyczny problem dotyczący wektorów logicznych?
źródło
Inną opcją jest użycie funkcji podsumowującej. Zawiera podsumowanie Ts, F i NA.
źródło
summary(hival)["TRUE"]
:;Robiłem coś podobnego kilka tygodni temu. Oto możliwe rozwiązanie, zostało napisane od zera, więc jest to wersja beta lub coś w tym rodzaju. Spróbuję to poprawić, usuwając pętle z kodu ...
Głównym pomysłem jest napisanie funkcji, która będzie pobierać 2 (lub 3) argumenty. Pierwsza to,
data.frame
która przechowuje dane zebrane z kwestionariusza, a druga to wektor numeryczny z poprawnymi odpowiedziami (dotyczy to tylko kwestionariusza jednokrotnego wyboru). Alternatywnie możesz dodać trzeci argument, który zwróci wektor numeryczny z wynikiem końcowym lub data.frame z osadzonym wynikiem.Postaram się zrobić to w bardziej elegancki sposób z jakąś funkcją * ply. Zauważ, że nie
na.rm
argumentowałem ... Zrobię toTeraz zastosuj funkcję:
Jeśli przekażesz argument data.frame, zwróci on zmodyfikowany data.frame. Spróbuję to naprawić ... Mam nadzieję, że to pomoże!
źródło
rowSums(t(t(d)==sol), na.rm=TRUE)
. Wektor recyklingu R. dla porównania. Jeśli macied
macierz z przypadkami w kolumnach, to upraszcza się dorowSums(d==sol, na.rm=TRUE)
.Właśnie miałem szczególny problem, w którym musiałem policzyć liczbę prawdziwych stwierdzeń z wektora logicznego i to działało najlepiej dla mnie ...
Więc to bierze podzbiór obiektu gene.rep.matrix i stosuje test logiczny, zwracając wektor logiczny. Ten wektor jest wstawiany jako argument dla grep, który zwraca lokalizacje wszystkich wpisów TRUE. Length następnie oblicza liczbę wpisów znalezionych przez grep, podając w ten sposób liczbę PRAWDA.
źródło
Istnieje również pakiet o nazwie,
bit
który jest specjalnie zaprojektowany do szybkich operacji logicznych. Jest to szczególnie przydatne, jeśli masz duże wektory lub musisz wykonać wiele operacji logicznych.źródło