Laten we zeggen dat ik heb:
v = rep(c(1,2, 2, 2), 25)
Nu wil ik tellen hoe vaak elke unieke waarde wordt weergegeven. unique(v)
retourneert wat de unieke waarden zijn, maar niet hoeveel ze zijn.
> unique(v)
[1] 1 2
Ik wil iets dat me
. geeft
length(v[v==1])
[1] 25
length(v[v==2])
[1] 75
maar als een meer algemene oneliner 🙂 Iets dat in de buurt komt (maar niet helemaal) zoals dit:
#<doesn't work right> length(v[v==unique(v)])
Antwoord 1, autoriteit 100%
Misschien is tafel wat je zoekt?
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
Antwoord 2, autoriteit 16%
Als u meerdere factoren (= een multidimensionaal gegevensframe) heeft, kunt u het pakket dplyr
gebruiken om unieke waarden te tellen in elke combinatie van factoren:
library("dplyr")
data %>% group_by(factor1, factor2) %>% summarize(count=n())
Het gebruikt de pipe-operator %>%
om methodeaanroepen te koppelen aan het dataframe data
.
Antwoord 3, autoriteit 11%
Het is een eenregelige aanpak door gebruik te maken van aggregate
.
> aggregate(data.frame(count = v), list(value = v), length)
value count
1 1 25
2 2 75
Antwoord 4, autoriteit 6%
De functie
table() is een goede manier om te gaan, zoals Chasesuggereerde.
Als u een grote dataset analyseert, is een alternatieve manier om de .N-functie in een datatable-pakket te gebruiken.
Zorg ervoor dat u het gegevenstabelpakket vóór
. hebt geïnstalleerd
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]
Antwoord 5, autoriteit 4%
Gebruik c()
om een niet-gedimensioneerde integer-vector te krijgen die het aantal unieke waarden bevat.
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"
Dit kan handig zijn als u de tellingen van unieke waarden in een andere functie moet invoeren, en is korter en meer idiomatisch dan de t(as.data.frame(table(dummyData))[,2]
gepost in een reactie op het antwoord van Chase. Met dank aan Ricardo Saporta die mij erop wees hier.
Antwoord 6, autoriteit 4%
Dit werkt voor mij. Neem je vector v
length(summary(as.factor(v),maxsum=50000))
Opmerking: stel maxsum in om groot genoeg te zijn om het aantal unieke waarden vast te leggen
of met het magrittr
pakket
v %>% as.factor %>% summary(maxsum=50000) %>% length
Antwoord 7, autoriteit 2%
length(unique(df$col))
is de meest eenvoudige manier die ik kan zien.
Antwoord 8, autoriteit 2%
Als u het aantal unieke waarden als een extra kolom in het gegevensframe met uw waarden wilt hebben (een kolom die bijvoorbeeld de steekproefomvang kan vertegenwoordigen), biedt plyr een handige manier:
data_frame <- data.frame(v = rep(c(1,2, 2, 2), 25))
library("plyr")
data_frame <- ddply(data_frame, .(v), transform, n = length(v))
Antwoord 9, autoriteit 2%
Je kunt ook een tidyverse
proberen
library(tidyverse)
dummyData %>%
as.tibble() %>%
count(value)
# A tibble: 2 x 2
value n
<dbl> <int>
1 1 25
2 2 75
Antwoord 10, autoriteit 2%
Ook de waarden categorisch maken en summary()
aanroepen zou werken.
> v = rep(as.factor(c(1,2, 2, 2)), 25)
> summary(v)
1 2
25 75
Antwoord 11
Als u uniek wilt werken op een data.frame (bijv. train.data), en ook de tellingen wilt krijgen (die kunnen worden gebruikt als het gewicht in classificaties), kunt u het volgende doen:
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)
}
Antwoord 12
Ik weet dat er nog veel meer antwoorden zijn, maar hier is een andere manier om het te doen met de functies sort
en rle
. De functie rle
staat voor Run Length Encoding. Het kan worden gebruikt voor het tellen van reeksen getallen (zie de R man-documenten op rle
), maar kan ook hier worden toegepast.
test.data = rep(c(1, 2, 2, 2), 25)
rle(sort(test.data))
## Run Length Encoding
## lengths: int [1:2] 25 75
## values : num [1:2] 1 2
Als u het resultaat vastlegt, heeft u als volgt toegang tot de lengtes en waarden:
## rle returns a list with two items.
result.counts <- rle(sort(test.data))
result.counts$lengths
## [1] 25 75
result.counts$values
## [1] 1 2
Antwoord 13
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")