webentwicklung-frage-antwort-db.com.de

Zählen der Anzahl der Elemente mit den Werten von x in einem Vektor

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?

341
RQuestions

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
...
433
Shane

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 suming 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).

230
hadley

Ich würde wahrscheinlich so etwas tun

length(which(numbers==x))

Aber es ist wirklich ein besserer Weg

table(numbers)
48
Jesse

Es gibt auch count(numbers) aus dem Paket plyr. Viel bequemer als table meiner Meinung nach.

35
geotheory

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.

31
JBecker

Dafür gibt es in R eine Standardfunktion

tabulate(numbers)

19
Sergej Andrejev
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
8
ishandutta2007

hier ist ein schneller und schmutziger Weg:

x <- 23
length(subset(numbers, numbers==x))
8
JD Long

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
8
Berny

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)

3
pomber

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
2
Akash

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']])
1
Therii

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 = `==`))
0
WD11