Es gibt einige Probleme, wenn der logische Vektor NA
Werte enthält .
Siehe zum Beispiel:
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)
Daher denke ich, dass es am sichersten ist, Folgendes zu verwenden na.rm = TRUE
:
sum(z, na.rm = TRUE) # best way to count TRUE values
(was 1 ergibt). Ich denke, dass die table
Lösung weniger effizient ist (siehe table
Funktionscode).
Sie sollten auch mit der "Tabellen" -Lösung vorsichtig sein, falls der logische Vektor keine TRUE-Werte enthält. Angenommen z <- c(NA, FALSE, NA)
oder einfach z <- c(FALSE, FALSE)
, dann table(z)["TRUE"]
gibt es Sie NA
für beide Fälle.
table(c(FALSE))["TRUE"]
gibt NA, nicht 0.sum(z, na.rm = TRUE)
Eine andere Option, die nicht erwähnt wurde, ist die Verwendung von
which
:Nur um tatsächlich einen Kontext für die "was schneller ist" -Frage bereitzustellen, ist es immer am einfachsten, sich selbst zu testen. Ich habe den Vektor zum Vergleich viel größer gemacht:
sum
In diesem Fall ist die Verwendung eindeutig der beste Ansatz. Möglicherweise möchten Sie auch nachNA
Werten suchen, wie von Marek vorgeschlagen.Nur um einen Hinweis zu den NA-Werten und der
which
Funktion hinzuzufügen :Beachten Sie, dass nur
TRUE
logische Werte überprüft werden , sodass nicht logische Werte im Wesentlichen ignoriert werden.quelle
Ein anderer Weg ist
Während
sum(z)
es nett und kurz ist, ist es für michlength(z[z==TRUE])
selbsterklärender. Ich denke jedoch, dass es bei einer einfachen Aufgabe wie dieser keinen wirklichen Unterschied macht ...Wenn es sich um einen großen Vektor handelt, sollten Sie sich wahrscheinlich für die schnellste Lösung entscheiden
sum(z)
.length(z[z==TRUE])
ist ungefähr 10x langsamer undtable(z)[TRUE]
ist ungefähr 200x langsamer alssum(z)
.Zusammenfassend
sum(z)
ist es am schnellsten zu tippen und auszuführen.quelle
which
ist eine gute Alternative, insbesondere wenn Sie mit Matrizen arbeiten (überprüfen?which
und beachten Sie dasarr.ind
Argument). Aber ich schlage vor, dass Sie bei bleibensum
, wegenna.rm
Argumenten, dieNA
in logischen Vektoren behandeln können. Zum Beispiel:Wenn Sie in geben
sum(x)
Sie erhaltenNA
als Ergebnis, aber wenn Sie passierenna.rm = TRUE
insum
Funktion, werden Sie das Ergebnis erhalten , die Sie wollen.Ist Ihre Frage streng theoretisch oder haben Sie ein praktisches Problem mit logischen Vektoren?
quelle
Eine weitere Option ist die Verwendung der Zusammenfassungsfunktion. Es gibt eine Zusammenfassung der Ts, Fs und NAs.
quelle
summary(hival)["TRUE"]
;Ich habe vor ein paar Wochen etwas Ähnliches gemacht. Hier ist eine mögliche Lösung, die von Grund auf neu geschrieben wurde. Es handelt sich also um eine Art Beta-Version oder ähnliches. Ich werde versuchen, es zu verbessern, indem ich Schleifen aus dem Code entferne ...
Die Hauptidee besteht darin, eine Funktion zu schreiben, die 2 (oder 3) Argumente akzeptiert. Die erste ist eine
data.frame
, die die aus dem Fragebogen gesammelten Daten enthält, und die zweite ist ein numerischer Vektor mit korrekten Antworten (dies gilt nur für Single-Choice-Fragebogen). Alternativ können Sie ein drittes Argument hinzufügen, das einen numerischen Vektor mit der endgültigen Bewertung oder data.frame mit der eingebetteten Bewertung zurückgibt.Ich werde versuchen, dies auf elegantere Weise mit einer * Ply-Funktion zu tun. Beachten Sie, dass ich kein
na.rm
Argument vorgebracht habe ... Ich werde das tunWenden Sie nun eine Funktion an:
Wenn Sie das Argument data.frame übergeben, wird das geänderte data.frame zurückgegeben. Ich werde versuchen, dieses Problem zu beheben ... Hoffe, es hilft!
quelle
rowSums(t(t(d)==sol), na.rm=TRUE)
. R Recycling-Vektor zum Vergleich. Wenn Sied
eine Matrix mit Fällen in Spalten waren, wird dies vereinfachtrowSums(d==sol, na.rm=TRUE)
.Ich hatte gerade ein bestimmtes Problem, bei dem ich die Anzahl der wahren Aussagen aus einem logischen Vektor zählen musste, und das funktionierte am besten für mich ...
Dies nimmt also eine Teilmenge des Objekts gene.rep.matrix und wendet einen logischen Test an, der einen logischen Vektor zurückgibt. Dieser Vektor wird als Argument für grep verwendet, das die Positionen aller TRUE-Einträge zurückgibt. Die Länge berechnet dann, wie viele Einträge grep findet, und gibt so die Anzahl der WAHREN Einträge an.
quelle
Es gibt auch ein Paket namens
bit
, das speziell für schnelle boolesche Operationen entwickelt wurde. Dies ist besonders nützlich, wenn Sie große Vektoren haben oder viele boolesche Operationen ausführen müssen.quelle