Ich habe einen Zahlenvektor:
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 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 subsetieren:
> a[names(a)==435]
435
3
Oder wandeln Sie es in ein data.frame um, wenn Sie mit dem arbeiten lieber sind:
> as.data.frame(table(numbers))
numbers Freq
1 4 2
2 5 1
3 23 2
4 34 2
...
Der direkteste Weg ist sum(numbers == x)
.
numbers == x
erstellt einen logischen Vektor, der an jeder Stelle, an der x auftritt, WAHR ist, und bei sum
ing wird der logische Vektor in einen numerischen Code umgewandelt, der WAHR in 1 und FALSCH in 0 konvertiert.
Beachten Sie jedoch, dass für Gleitkommazahlen Folgendes verwendet werden sollte: sum(abs(numbers - x) < 1e-6)
.
Ich würde wahrscheinlich so etwas tun
length(which(numbers==x))
Aber es ist wirklich ein besserer Weg
table(numbers)
Es gibt auch count(numbers)
aus dem Paket plyr
. Viel bequemer als table
meiner Meinung nach.
Meine bevorzugte Lösung verwendet rle
, die einen Wert (die Beschriftung, x
in Ihrem Beispiel) und eine Länge zurückgibt, die angibt, wie oft dieser Wert in der Reihenfolge angezeigt wurde.
Durch die Kombination von rle
mit sort
können Sie extrem schnell zählen, wie oft ein Wert aufgetreten ist. 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 gewünschte Wert nicht angezeigt wird oder Sie diesen Wert später speichern müssen, machen Sie a
zu 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
Ich finde es selten, dass ich die Häufigkeit eines Werts und nicht alle Werte wissen möchte, und rle scheint der schnellste Weg zu sein, um zu zählen und alle zu speichern.
Dafür gibt es in R eine Standardfunktion
tabulate(numbers)
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
hier ist ein schneller und schmutziger Weg:
x <- 23
length(subset(numbers, numbers==x))
Wenn Sie die Anzahl der Auftritte anschließend zählen möchten, können Sie die Funktion sapply
verwenden:
index<-sapply(1:length(numbers),function(x)sum(numbers[1:x]==numbers[x]))
cbind(numbers, index)
Ausgabe:
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
Sie können die Nummer in der folgenden Zeile beliebig ändern
length(which(numbers == 4))
Verwendung der Tabelle ohne Vergleich mit names
:
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 eine Zählung benötigen, verwenden Sie sum(numbers == x)
Eine weitere Möglichkeit, die ich bequem finde, 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)))
Dadurch wird das Dataset in einen Faktor konvertiert, und Summary () gibt uns die Kontrollsummen (Anzahl der eindeutigen Werte).
Ausgabe 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 kann, falls gewünscht, als Datenrahmen gespeichert werden.
as.data.frame (cbind (Number = Namen, Freq = S), StringsAsFactors = F, Row.names = 1: Länge (s))
hier wurde row.names verwendet, um die Zeilennamen umzubenennen . Ohne Zeilennamen zu verwenden, werden die Spaltennamen in s als Zeilennamen in einem neuen Datenrahmen verwendet
Ausgabe 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
Es gibt verschiedene Möglichkeiten, bestimmte Elemente zu zählen
library(plyr)
numbers =c(4,23,4,23,5,43,54,56,657,67,67,435,453,435,7,65,34,435)
print(length(which(numbers==435)))
#Sum counts number of TRUE's in a vector
print(sum(numbers==435))
print(sum(c(TRUE, FALSE, TRUE)))
#count is present in plyr library
#o/p of count is a DataFrame, freq is 1 of the columns of data frame
print(count(numbers[numbers==435]))
print(count(numbers[numbers==435])[['freq']])
Dies kann mit outer
durchgeführt werden, um eine Metrik von Gleichungen zu erhalten, gefolgt von rowSums
mit einer offensichtlichen Bedeutung.
Um die Anzahl und numbers
in derselben Datenmenge zu haben, wird zuerst ein data.frame erstellt. Dieser Schritt ist nicht erforderlich, wenn Sie separate Ein- und Ausgaben wünschen.
df <- data.frame(No = numbers)
df$count <- rowSums(outer(df$No, df$No, FUN = `==`))