2009-12-17 14 views

Antwort

356

Sie können nur table() verwenden:

> 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 Teilmenge:

> a[names(a)==435] 
435 
    3 

oder in eine data.frame konvertieren, wenn Sie mehr vertraut sind mit der Arbeit:

+12

Vergessen Sie nicht potenzielle Gleitkomma-Probleme, insbesondere bei Tabellen, die Zahlen in Strings konvertieren. – hadley

+3

Das ist ein großartiger Punkt. Das sind alles ganze Zahlen, also ist es in diesem Beispiel kein echtes Problem, oder? – Shane

+0

nicht genau. Die Elemente der Tabelle sind Klassen der Integer-Klasse (Tabelle (Zahlen) [1]), aber 435 ist eine Gleitkommazahl. Um es zu einer Ganzzahl zu machen, können Sie 435L verwenden. –

8

hier ist ein schneller und schmutziger Weg:

x <- 23 
length(subset(numbers, numbers==x)) 
43

würde ich wahrscheinlich so etwas wie diese

length(which(numbers==x)) 

tut Aber wirklich, ein besserer Weg

table(numbers) 
+10

'table (numbers)' wird viel mehr Arbeit als die einfachste Lösung, 'sum (numbers == x) ', weil es auch die Zählungen aller anderen Zahlen in der Liste herausfinden wird. –

+1

das Problem mit der Tabelle ist, dass es schwieriger ist, es in komplexeren Kalkül zu integrieren, zum Beispiel mit apply() auf Datenrahmen – skan

205

Der direkteste Weg sum(numbers == x) ist.

numbers == x erzeugt eine logische Vektor, der an jeder Stelle richtig ist, dass x auftritt, und wenn sum ing, die logische Vektor auf numerische dazu gezwungen ist, die mit 1 und FALSCH auf 0

, beachten Sie jedoch TRUE konvertiert, dass für Fließkommazahlen ist es besser, etwas wie zu verwenden: sum(abs(numbers - x) < 1e-6).

+1

guten Punkt über das Gleitkomma Problem. Das beißt mich mehr in den Hintern, als ich allgemein zugeben möchte. –

+3

@Jason, während es die Frage direkt beantwortet, meine Vermutung ist, dass Leute die allgemeinere Lösung mochten, die die Antwort für alle "x" in den Daten eher als einen spezifischen bekannten Wert von "x" zur Verfügung stellt. Um ehrlich zu sein, darum ging es in der ursprünglichen Frage. Wie ich in meiner Antwort unten sagte, "Ich finde es selten, dass ich die Häufigkeit eines Wertes und nicht alle Werte wissen möchte ..." – JBecker

16

Es ist eine Standardfunktion in R für die

tabulate(numbers)

+0

Der Nachteil von 'tabulate' ist, dass Sie nicht mit Null und umgehen können negative Zahlen. – omar

+1

Aber Sie können mit Null-Instanzen einer bestimmten Zahl umgehen, die die anderen Lösungen nicht behandeln – Dodgie

30

Meine bevorzugte Lösung verwendet rle, die einen Wert zurückgeben wird (das Etikett, x in Ihrem Beispiel) und eine Länge, die darstellt, wie viele Mal, dass der Wert der Reihe nach auftrat.

Durch die Kombination von rle mit sort haben Sie eine extrem schnelle Methode, um zu zählen, wie oft ein Wert angezeigt wurde. Dies kann bei komplexeren Problemen hilfreich sein.

Beispiel:

> numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435,453,435,324,34,456,56,567,65,34,435) 
> a <- rle(sort(numbers)) 
> a 
    Run Length Encoding 
    lengths: int [1:15] 2 1 2 2 1 1 2 1 2 1 ... 
    values : num [1:15] 4 5 23 34 43 54 56 65 67 324 ... 

Wenn der Wert, den Sie wollen nicht zu sehen, oder Sie müssen für später diesen Wert speichern, machen a ein data.frame.

> b <- data.frame(number=a$values, n=a$lengths) 
> b 
    values n 
1  4 2 
2  5 1 
3  23 2 
4  34 2 
5  43 1 
6  54 1 
7  56 2 
8  65 1 
9  67 2 
10 324 1 
11 435 3 
12 453 1 
13 456 1 
14 567 1 
15 657 1 

finde ich es selten ist, dass ich die Frequenz von einem Wert und nicht alle Werte wissen wollen, und rle scheint der schnellste Weg, um zu bekommen zählen und speichern sie alle.

+1

Ist der Vorteil dieser, vs. Tabelle, dass es ein Ergebnis in einem leichter verwendbaren Format gibt? danke –

+0

@HeatherStark Ich würde sagen es gibt zwei Vorteile. Das erste ist definitiv, dass es ein leichter benutzbares Format als die Tabellenausgabe ist. Die zweite ist, dass ich manchmal die Anzahl der Elemente "in einer Reihe" und nicht innerhalb des gesamten Datensatzes zählen möchte. Zum Beispiel würde 'c (rep ('A', 3), rep ('G', 4), 'A', rep ('G', 2), rep ('C', 10)) 'zurückkehren Werte = c ('A', 'G', 'A', 'G', 'C') 'und' Längen = c (3, 4, 1, 2, 10) '' was manchmal nützlich ist. – JBecker

+1

mit Microbenchmark, es scheint, dass 'Tabelle' ist schneller' wenn der Vektor ist lang '(ich versuchte 100000), aber etwas länger, wenn es kürzer (ich versuchte 1000) – clemlaflemme

30

Es gibt auch count(numbers) von plyr Paket. Viel praktischer als table meiner Meinung nach.

2

Eine weitere Möglichkeit, i bequem finden ist:

numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435,453,435,324,34,456,56,567,65,34,435) 
(s<-summary (as.factor(numbers))) 

Dieser wandelt den Datensatz Faktor, und dann Zusammenfassung() gibt uns die Kontrollsummen (Zählungen der eindeutigen Werte).

Ausgang ist:

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 

Dies als Datenrahmen gespeichert werden kann, wenn bevorzugt.

as.data.frame (cbind (Number = Namen (s), Freq = s), stringsAsFactors = F, row.names = 1: Länge (s))

hier Reihe. Namen wurden zum Umbenennen von Zeilennamen verwendet. ohne row.names, Spaltennamen in s zu verwenden, werden als Zeilennamen in neuem Datenrahmen verwenden

Ausgang ist:

 Number Freq 
1  4 2 
2  5 1 
3  23 2 
4  34 2 
5  43 1 
6  54 1 
7  56 2 
8  65 1 
9  67 2 
10 324 1 
11 435 3 
12 453 1 
13 456 1 
14 567 1 
15 657 1 
2

Tabelle verwendet, aber ohne mit names Vergleich:

numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435) 
x <- 67 
numbertable <- table(numbers) 
numbertable[as.character(x)] 
#67 
# 2 

table ist nützlich, wenn Sie die Anzahl der verschiedenen Elemente mehrmals verwenden. Wenn Sie nur einen Zähler benötigen, verwenden sum(numbers == x)

6

Wenn Sie die Anzahl der Erscheinungen anschließend zählen möchten, Sie nutzen die sapply Funktion machen kann:

index<-sapply(1:length(numbers),function(x)sum(numbers[1:x]==numbers[x])) 
cbind(numbers, index) 

Ausgang:

 numbers index 
[1,]  4  1 
[2,]  23  1 
[3,]  4  2 
[4,]  23  2 
[5,]  5  1 
[6,]  43  1 
[7,]  54  1 
[8,]  56  1 
[9,]  657  1 
[10,]  67  1 
[11,]  67  2 
[12,]  435  1 
[13,]  453  1 
[14,]  435  2 
[15,]  324  1 
[16,]  34  1 
[17,]  456  1 
[18,]  56  2 
[19,]  567  1 
[20,]  65  1 
[21,]  34  2 
[22,]  435  3 
6

Sie kann die Nummer ändern, was Sie in der folgenden Zeile wünschen

4
numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435 453,435,324,34,456,56,567,65,34,435) 

> length(grep(435, numbers)) 
[1] 3 


> length(which(435 == numbers)) 
[1] 3 


> require(plyr) 
> df = count(numbers) 
> df[df$x == 435, ] 
    x freq 
11 435 3 


> sum(435 == numbers) 
[1] 3 


> sum(grepl(435, numbers)) 
[1] 3 


> sum(435 == numbers) 
[1] 3 


> tabulate(numbers)[435] 
[1] 3 


> table(numbers)['435'] 
435 
    3 


> length(subset(numbers, numbers=='435')) 
[1] 3 
Verwandte Themen