Tel het aantal voorkomens voor elke unieke waarde

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 dplyrgebruiken 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 magrittrpakket

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 sorten rle. De functie rlestaat 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")

LEAVE A REPLY

Please enter your comment!
Please enter your name here

11 − nine =

Other episodes