Порахуйте кількість випадків для кожного унікального значення


140

Скажімо, у мене є:

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

Тепер я хочу підрахувати кількість появи кожного унікального значення. unique(v) повертає те, що є унікальними значеннями, але не скільки їх є.

> unique(v)
[1] 1 2

Я хочу чогось, що дає мені

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

але як більш загальний однолінійний :) Щось близьке (але не зовсім), як це:

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

Відповіді:


179

Можливо, стіл - це те, що ви хочете?

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
Ага, так, я можу використовувати це, з невеликою модифікацією: t (as.data.frame (table (v)) [, 2]) - саме те, що мені потрібно, дякую
gakera

1
Раніше я це робив незручно hist. tableздається зовсім трохи повільніше, ніж hist. Цікаво, чому. Чи може хтось підтвердити?
Помітно

2
Чейз, будь-який шанс замовити за частотою? У мене точно така ж проблема, але в моїй таблиці приблизно 20000 записів, і я хотів би знати, наскільки часто зустрічаються найпоширеніші записи.
Торвон

5
@Torvon - впевнено, просто використовуйте order()результати. тобтоx <- as.data.frame(table(dummyData)); x[order(x$Freq, decreasing = TRUE), ]
Чейз

Цей метод не є гарним, він підходить лише для дуже мало даних з великою кількістю повторень, він не підійде для безлічі нескінченних даних з кількома дублюючими записами.
Глибокий Північ

26

Якщо у вас є кілька факторів (= багатовимірний кадр даних), ви можете використовувати dplyrпакет для підрахунку унікальних значень у кожній комбінації факторів:

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

Він використовує оператор труби %>%для ланцюга викликів методу на кадр даних data.


21

Це однолінійний підхід із використанням aggregate.

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

  value count
1     1    25
2     2    75

11

Функція table () - це хороший шлях, як запропонував Чейз . Якщо ви аналізуєте великий набір даних, альтернативним способом є використання .N функції в пакеті даних.

Переконайтесь, що встановлено пакет таблиці даних від

install.packages("data.table")

Код:

# 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

Щоб отримати нерозмірний цілий вектор, який містить кількість унікальних значень, використовуйте 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"

Це може бути корисно, якщо вам потрібно перерахувати кількість унікальних значень в іншу функцію, і вона коротша і ідіоматична, ніж t(as.data.frame(table(dummyData))[,2]розміщена в коментарі до відповіді Чейза. Дякую Рікардо Сапорта, який вказав мені це тут .


7

Це працює для мене. Візьміть свій векторv

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

Коментар: встановіть maxsum достатньо великим, щоб зафіксувати кількість унікальних значень

або з magrittrпакетом

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


4

Якщо вам потрібно мати кількість унікальних значень як додатковий стовпець у кадрі даних, що містить ваші значення (стовпець, який може представляти розмір вибірки, наприклад), plyr забезпечує акуратний спосіб:

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
або ddply(data_frame, .(v), count). Також варто уточнити, що для роботи вам потрібен library("plyr")дзвінок ddply.
Брайан Діггс

Здається дивним, transformа не під mutateчас використання plyr.
Грегор Томас

3

Також перетворення цінностей у категоричні та викликові summary()роботи буде спрацьовувати.

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

2

Ви можете спробувати також tidyverse

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

0

Якщо ви хочете запустити унікальний на data.frame (наприклад, train.data), а також отримати підрахунки (які можна використовувати як вагу в класифікаторах), ви можете зробити наступне:

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

довжина (унікальна (df $ col)) - це найпростіший спосіб, який я бачу.


R, мабуть, значно розвинувся за останні 10 років, відколи я задав це питання.
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")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.