webentwicklung-frage-antwort-db.com.de

Zählen Sie eindeutige Werte

Sagen wir, ich habe:

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

Nun möchte ich die Anzahl zählen, die jeder eindeutige Wert angezeigt wird. unique(v) gibt zurück, was die eindeutigen Werte sind, aber nicht, wie viele es sind. 

> unique(v)
[1] 1 2

Ich will etwas, das mir gibt 

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

aber als allgemeiner One-Liner :) Etwas nah (aber nicht ganz) wie folgt:

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

Vielleicht ist Tisch das, was 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
147
Chase

Wenn Sie über mehrere Faktoren (= mehrdimensionaler Datenrahmen) verfügen, können Sie das Paket dplyr 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 %>% zur Verkettung von Methodenaufrufen im Datenrahmen data.

17
antoine

Es ist ein einzeiliger Ansatz mit aggregate

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

  value count
1     1    25
2     2    75
16
SeaSprite

die table () - Funktion ist ein guter Weg, wie Chase vorgeschlagen . Wenn Sie ein großes Dataset analysieren, können Sie die .N-Funktion in einem Datenpaket verwenden.

Stellen Sie sicher, dass Sie das Datentabellenpaket mit 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]
9
C. Zeng

Um einen nicht dimensionierten Ganzzahlvektor zu erhalten, der die Anzahl der eindeutigen Werte enthält, verwenden Sie 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 und kürzer und idiomatischer sind als die Funktion t(as.data.frame(table(dummyData))[,2] in einem Kommentar zu Chases Antwort. Danke an Ricardo Saporta, der mich darauf aufmerksam gemacht hat hier .

7
Ben

Das funktioniert bei mir. Nehmen Sie Ihren Vektor v

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

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

oder mit dem Paket magrittr

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

6
Anthony Ebert

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

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

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

Sie können auch eine tidyverse versuchen

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

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

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

Wenn Sie auf einem data.frame (z. B. train.data) eine eindeutige Ausführung ausführen möchten und auch die Zählungen abrufen möchten (die als Klassifizierung in Klassifizierern verwendet werden können), haben Sie folgende Möglichkeiten:

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
user2771312