Zählen Sie die Anzahl der Vorkommen für jeden eindeutigen Wert


140

Nehmen wir an, ich habe:

v = rep(c(1,2, 2, 2), 25)

Jetzt möchte ich zählen, wie oft jeder eindeutige Wert angezeigt wird. unique(v) Gibt die eindeutigen Werte zurück, jedoch nicht die Anzahl.

> unique(v)
[1] 1 2

Ich möchte etwas, das mir gibt

length(v[v==1])
[1] 25
length(v[v==2])
[1] 75

aber als allgemeinerer Einzeiler :) Etwas Nahes (aber nicht ganz) wie dieses:

#<doesn't work right> length(v[v==unique(v)])

Antworten:


179

Vielleicht ist Tisch das, wonach Sie suchen?

dummyData = rep(c(1,2, 2, 2), 25)

table(dummyData)
# dummyData
#  1  2 
# 25 75

## or another presentation of the same data
as.data.frame(table(dummyData))
#    dummyData Freq
#  1         1   25
#  2         2   75

7
Ah, ja, ich kann dies mit einigen geringfügigen Änderungen verwenden: t (as.data.frame (Tabelle (v)) [, 2]) ist genau das, was ich brauche, danke
gakera

1
Ich habe das immer umständlich gemacht hist. tablescheint etwas langsamer als hist. Ich wundere mich warum. Kann jemand bestätigen?
Museful

2
Chase, gibt es eine Chance, nach Häufigkeit zu bestellen? Ich habe genau das gleiche Problem, aber meine Tabelle enthält ungefähr 20000 Einträge und ich möchte wissen, wie häufig die häufigsten Einträge sind.
Torvon

5
@Torvon - sicher, nur order()für die Ergebnisse verwenden. dhx <- as.data.frame(table(dummyData)); x[order(x$Freq, decreasing = TRUE), ]
Chase

Diese Methode ist nicht gut, sie ist nur für sehr wenige Daten mit vielen wiederholten Daten geeignet. Sie passt nicht für viele kontinuierliche Daten mit wenigen duplizierten Datensätzen.
Deep North

26

Wenn Sie mehrere Faktoren haben (= ein mehrdimensionaler Datenrahmen), können Sie das dplyrPaket verwenden, um eindeutige Werte in jeder Kombination von Faktoren zu zählen:

library("dplyr")
data %>% group_by(factor1, factor2) %>% summarize(count=n())

Es verwendet den Pipe-Operator, %>%um Methodenaufrufe im Datenrahmen zu verketten data.


21

Es ist ein einzeiliger Ansatz mit aggregate.

> aggregate(data.frame(count = v), list(value = v), length)

  value count
1     1    25
2     2    75

11

Die Funktion table () ist ein guter Weg, wie Chase vorgeschlagen hat. Wenn Sie einen großen Datensatz analysieren, können Sie alternativ die .N-Funktion in einem datierbaren Paket verwenden.

Stellen Sie sicher, dass Sie das Datentabellenpaket von installiert haben

install.packages("data.table")

Code:

# Import the data.table package
library(data.table)

# Generate a data table object, which draws a number 10^7 times  
# from 1 to 10 with replacement
DT<-data.table(x=sample(1:10,1E7,TRUE))

# Count Frequency of each factor level
DT[,.N,by=x]

8

Verwenden Sie, um einen nicht dimensionierten Ganzzahlvektor zu erhalten, der die Anzahl der eindeutigen Werte enthält c().

dummyData = rep(c(1, 2, 2, 2), 25) # Chase's reproducible data
c(table(dummyData)) # get un-dimensioned integer vector
 1  2 
25 75

str(c(table(dummyData)) ) # confirm structure
 Named int [1:2] 25 75
 - attr(*, "names")= chr [1:2] "1" "2"

Dies kann nützlich sein, wenn Sie die Anzahl der eindeutigen Werte in eine andere Funktion eingeben müssen. Sie ist kürzer und idiomatischer als die t(as.data.frame(table(dummyData))[,2]in einem Kommentar zu Chases Antwort veröffentlichten. Vielen Dank an Ricardo Saporta, der mich hier darauf hingewiesen hat .


7

Das funktioniert bei mir. Nimm deinen Vektorv

length(summary(as.factor(v),maxsum=50000))

Kommentar: Stellen Sie maxsum so ein, dass die Anzahl der eindeutigen Werte erfasst wird

oder mit dem magrittrPaket

v %>% as.factor %>% summary(maxsum=50000) %>% length


4

Wenn Sie die Anzahl der eindeutigen Werte als zusätzliche Spalte im Datenrahmen mit Ihren Werten benötigen (eine Spalte, die beispielsweise die Stichprobengröße darstellt), bietet plyr eine übersichtliche Möglichkeit:

data_frame <- data.frame(v = rep(c(1,2, 2, 2), 25))

library("plyr")
data_frame <- ddply(data_frame, .(v), transform, n = length(v))

3
oder ddply(data_frame, .(v), count). Es lohnt sich auch, deutlich zu machen, dass Sie einen library("plyr")Anruf benötigen , damit die ddplyArbeit funktioniert.
Brian Diggs

Scheint seltsam zu verwenden, transformanstatt mutatebei der Verwendung plyr.
Gregor Thomas

3

Es summary()würde auch funktionieren , die Werte kategorisch zu machen und aufzurufen .

> v = rep(as.factor(c(1,2, 2, 2)), 25)
> summary(v)
 1  2 
25 75 

2

Sie können auch versuchen, ein tidyverse

library(tidyverse) 
dummyData %>% 
    as.tibble() %>% 
    count(value)
# A tibble: 2 x 2
  value     n
  <dbl> <int>
1     1    25
2     2    75

0

Wenn Sie eine eindeutige Ausführung auf einem data.frame (z. B. train.data) ausführen und auch die Anzahl erhalten möchten (die als Gewichtung in Klassifizierern verwendet werden kann), können Sie Folgendes tun:

unique.count = function(train.data, all.numeric=FALSE) {                                                                                                                                                                                                 
  # first convert each row in the data.frame to a string                                                                                                                                                                              
  train.data.str = apply(train.data, 1, function(x) paste(x, collapse=','))                                                                                                                                                           
  # use table to index and count the strings                                                                                                                                                                                          
  train.data.str.t = table(train.data.str)                                                                                                                                                                                            
  # get the unique data string from the row.names                                                                                                                                                                                     
  train.data.str.uniq = row.names(train.data.str.t)                                                                                                                                                                                   
  weight = as.numeric(train.data.str.t)                                                                                                                                                                                               
  # convert the unique data string to data.frame
  if (all.numeric) {
    train.data.uniq = as.data.frame(t(apply(cbind(train.data.str.uniq), 1, 
      function(x) as.numeric(unlist(strsplit(x, split=","))))))                                                                                                    
  } else {
    train.data.uniq = as.data.frame(t(apply(cbind(train.data.str.uniq), 1, 
      function(x) unlist(strsplit(x, split=",")))))                                                                                                    
  }
  names(train.data.uniq) = names(train.data)                                                                                                                                                                                          
  list(data=train.data.uniq, weight=weight)                                                                                                                                                                                           
}  

0

Länge (eindeutig (df $ col)) ist der einfachste Weg, den ich sehen kann.


R hat sich in den letzten 10 Jahren wahrscheinlich sehr weiterentwickelt, seit ich diese Frage gestellt habe.
Gakera

-2
count_unique_words <-function(wlist) {
ucountlist = list()
unamelist = c()
for (i in wlist)
{
if (is.element(i, unamelist))
    ucountlist[[i]] <- ucountlist[[i]] +1
else
    {
    listlen <- length(ucountlist)
    ucountlist[[i]] <- 1
    unamelist <- c(unamelist, i)
    }
}
ucountlist
}

expt_counts <- count_unique_words(population)
for(i in names(expt_counts))
    cat(i, expt_counts[[i]], "\n")
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.