Ich habe einen Vektor von Zahlen:
numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435,
453,435,324,34,456,56,567,65,34,435)
Wie kann ich R zählen lassen, wie oft ein Wert x im Vektor erscheint?
Sie können einfach verwenden table()
:
> a <- table(numbers)
> a
numbers
4 5 23 34 43 54 56 65 67 324 435 453 456 567 657
2 1 2 2 1 1 2 1 2 1 3 1 1 1 1
Dann können Sie es unterteilen:
> a[names(a)==435]
435
3
Oder konvertieren Sie es in einen data.frame, wenn Sie damit besser arbeiten können:
> as.data.frame(table(numbers))
numbers Freq
1 4 2
2 5 1
3 23 2
4 34 2
...
a["435"]
anstelle vona[names(a)==435]
?Der direkteste Weg ist
sum(numbers == x)
.numbers == x
Erstellt einen logischen Vektor, der an jeder Stelle, an der x auftritt, WAHR ist, und wenn er ausgeführt wirdsum
, wird der logische Vektor in einen numerischen Vektor gezwungen, der WAHR in 1 und FALSCH in 0 konvertiert.Beachten Sie jedoch, dass es für Gleitkommazahlen besser ist, Folgendes zu verwenden :
sum(abs(numbers - x) < 1e-6)
.quelle
x
in den Daten liefert, anstatt einen bestimmten bekannten Wert vonx
. Um fair zu sein, darum ging es in der ursprünglichen Frage. Wie ich in meiner Antwort unten sagte: "Ich finde, es ist selten, dass ich die Häufigkeit eines Wertes und nicht aller Werte wissen möchte ..."Ich würde wahrscheinlich so etwas tun
Aber wirklich, ein besserer Weg ist
quelle
table(numbers)
wird viel mehr Arbeit leisten als die einfachste Lösung,sum(numbers==x)
weil es auch die Anzahl aller anderen Zahlen in der Liste herausfinden wird.Es gibt auch
count(numbers)
ausplyr
Paket. Viel bequemer alstable
meiner Meinung nach.quelle
Meine bevorzugte Lösung verwendet
rle
, die einen Wert (x
in Ihrem Beispiel die Bezeichnung ) und eine Länge zurückgibt, die angibt, wie oft dieser Wert nacheinander angezeigt wurde.Durch die Kombination
rle
mitsort
haben Sie eine extrem schnelle Möglichkeit, die Häufigkeit zu zählen, mit der ein Wert angezeigt wurde. Dies kann bei komplexeren Problemen hilfreich sein.Beispiel:
Wenn der gewünschte Wert nicht angezeigt wird oder Sie diesen Wert für später speichern müssen, erstellen Sie
a
adata.frame
.Ich finde es selten, dass ich die Häufigkeit eines Wertes und nicht aller Werte wissen möchte, und rle scheint der schnellste Weg zu sein, um alle zu zählen und zu speichern.
quelle
c(rep('A', 3), rep('G', 4), 'A', rep('G', 2), rep('C', 10))
würde zurückkehrenvalues = c('A','G','A','G','C')
undlengths=c(3, 4, 1, 2, 10)
was manchmal nützlich ist.table
es schneller zu seinwhen the vector is long
(ich habe 100000 ausprobiert), aber etwas länger, wenn es kürzer ist (ich habe 1000 ausprobiert)Dafür gibt es in R eine Standardfunktion
tabulate(numbers)
quelle
tabulate
ist, dass Sie nicht mit Nullen und negativen Zahlen umgehen können.tabulate
. Hinweis:sort
scheint für die korrekte Verwendung im Allgemeinen erforderlich zu sein :tabulate(sort(numbers))
.quelle
Hier ist ein schneller und schmutziger Weg:
quelle
Wenn Sie die Anzahl der Auftritte anschließend zählen möchten, können Sie die folgende
sapply
Funktion verwenden:Ausgabe:
quelle
Sie können die Nummer in der folgenden Zeile beliebig ändern
quelle
Ein weiterer Weg, den ich bequem finde, ist:
Dadurch wird der Datensatz in einen Faktor konvertiert, und dann gibt summary () die Kontrollsummen (Anzahl der eindeutigen Werte) an.
Ausgabe ist:
Dies kann bei Bedarf als Datenrahmen gespeichert werden.
Hier wurde row.names verwendet, um Zeilennamen umzubenennen. Ohne Verwendung von row.names werden Spaltennamen in s als Zeilennamen in neuen Datenrahmen verwendet
Ausgabe ist:
quelle
Tabelle verwenden, aber ohne zu vergleichen mit
names
:table
ist nützlich, wenn Sie die Anzahl der verschiedenen Elemente mehrmals verwenden. Wenn Sie nur eine Zählung benötigen, verwenden Siesum(numbers == x)
quelle
Es gibt verschiedene Möglichkeiten, bestimmte Elemente zu zählen
quelle
Eine Methode, die bei langen Vektoren relativ schnell ist und eine bequeme Ausgabe liefert, ist die Verwendung
lengths(split(numbers, numbers))
(beachten Sie das S am Ende vonlengths
):Die Ausgabe ist einfach ein benannter Vektor.
Die Geschwindigkeit scheint vergleichbar mit
rle
der von JBecker vorgeschlagenen und bei sehr langen Vektoren sogar etwas schneller zu sein. Hier ist ein Mikrobenchmark in R 3.6.2 mit einigen der vorgeschlagenen Funktionen:Wichtig ist, dass die einzige Funktion, die auch die Anzahl der fehlenden Werte zählt,
NA
istplyr::count
. Diese können auch separat mit bezogen werdensum(is.na(vec))
quelle
Dies ist eine sehr schnelle Lösung für eindimensionale Atomvektoren. Es
match()
basiert auf , ist also kompatibel mitNA
:Sie können den Algorithmus auch so anpassen, dass er nicht ausgeführt wird
unique()
.In Fällen, in denen diese Ausgabe wünschenswert ist, benötigen Sie sie wahrscheinlich nicht einmal, um den ursprünglichen Vektor zurückzugeben, und die zweite Spalte ist wahrscheinlich alles, was Sie benötigen. Sie können das in einer Zeile mit dem Rohr erhalten:
quelle
Dies kann getan werden
outer
, um eine Metrik von Gleichheiten zu erhalten, gefolgt vonrowSums
einer offensichtlichen Bedeutung.Um die
numbers
Anzahl und das gleiche Dataset zu erhalten, wird zuerst ein data.frame erstellt. Dieser Schritt ist nicht erforderlich, wenn Sie eine separate Eingabe und Ausgabe wünschen.quelle