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)])
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
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
.
Es ist ein einzeiliger Ansatz mit aggregate
.
> aggregate(data.frame(count = v), list(value = v), length)
value count
1 1 25
2 2 75
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]
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 .
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
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))
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
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
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)
}