Hitung jumlah kemunculan untuk setiap nilai unik

145

Katakanlah saya punya:

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

Sekarang, saya ingin menghitung berapa kali setiap nilai unik muncul. unique(v) mengembalikan nilai uniknya, tetapi bukan berapa jumlahnya.

> unique(v)
[1] 1 2

Saya ingin sesuatu yang memberi saya

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

tetapi sebagai satu baris yang lebih umum :) Sesuatu yang dekat (tetapi tidak cukup) seperti ini:

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

Jawaban:

183

Mungkin meja adalah apa yang Anda cari?

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
Mengejar
sumber
7
Ah, ya, saya bisa menggunakan ini, dengan sedikit modifikasi: t (as.data.frame (table (v)) [, 2]) persis seperti yang saya butuhkan, terima kasih
gakera
1
Saya biasa melakukan ini dengan canggung hist. tabletampaknya sedikit lebih lambat dari hist. Kenapa ya. Adakah yang bisa mengkonfirmasi?
Museful
2
Chase, ada kesempatan untuk memesan berdasarkan frekuensi? Saya memiliki masalah yang persis sama, tetapi tabel saya memiliki sekitar 20.000 entri dan saya ingin tahu seberapa sering entri yang paling umum.
Torvon
5
@Torvon - tentu, gunakan saja order()hasil. yaitux <- as.data.frame(table(dummyData)); x[order(x$Freq, decreasing = TRUE), ]
Mengejar
Metode ini tidak baik, hanya cocok untuk data yang sangat sedikit dengan banyak pengulangan, tidak akan cocok untuk banyak data berkelanjutan dengan sedikit rekaman duplikat.
Jauh Utara
29

Jika Anda memiliki beberapa faktor (= bingkai data multi-dimensi), Anda dapat menggunakan dplyrpaket untuk menghitung nilai unik di setiap kombinasi faktor:

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

Ini menggunakan operator pipa %>%untuk memanggil metode rantai pada bingkai data data.

antoine
sumber
Atau, dan sedikit lebih pendek:data %>% count(factor1, factor2)
David
21

Ini adalah pendekatan satu baris dengan menggunakan aggregate.

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

  value count
1     1    25
2     2    75
SeaSprite
sumber
11

table () fungsi adalah cara yang baik untuk pergi, seperti yang disarankan Chase . Jika Anda menganalisis kumpulan data yang besar, cara alternatifnya adalah dengan menggunakan fungsi .N dalam paket dataTable.

Pastikan Anda menginstal paket tabel data dengan

install.packages("data.table")

Kode:

# 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]
C. Zeng
sumber
8

Untuk mendapatkan vektor bilangan bulat tak berdimensi yang berisi jumlah nilai unik, gunakan 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"

Ini mungkin berguna jika Anda perlu memasukkan jumlah nilai unik ke fungsi lain, dan lebih pendek dan lebih idiomatis daripada yang t(as.data.frame(table(dummyData))[,2]diposting dalam komentar untuk jawaban Chase. Terima kasih kepada Ricardo Saporta yang menunjukkan hal ini kepada saya di sini .

Ben
sumber
7

Ini berhasil untuk saya. Ambil vektor Andav

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

Komentar: setel makssum agar cukup besar untuk menangkap jumlah nilai unik

atau dengan magrittrpaketnya

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

Anthony Ebert
sumber
4

Jika Anda perlu memiliki jumlah nilai unik sebagai kolom tambahan dalam bingkai data yang berisi nilai Anda (kolom yang mungkin mewakili ukuran sampel misalnya), plyr menyediakan cara yang rapi:

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

library("plyr")
data_frame <- ddply(data_frame, .(v), transform, n = length(v))
Lionel Henry
sumber
3
atau ddply(data_frame, .(v), count). Juga patut diperjelas bahwa Anda memerlukan library("plyr")panggilan untuk membuatnya ddplybekerja.
Brian Diggs
Tampaknya aneh untuk digunakan transformdaripada mutatesaat menggunakan plyr.
Gregor Thomas
3

Juga membuat nilai-nilai kategoris dan memanggil summary()akan berhasil.

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

Anda juga dapat mencoba a tidyverse

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

Jika Anda ingin menjalankan unique pada data.frame (mis., Train.data), dan juga mendapatkan jumlah (yang dapat digunakan sebagai bobot dalam pengklasifikasi), Anda dapat melakukan hal berikut:

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)                                                                                                                                                                                           
}  
pengguna2771312
sumber
0

Saya tahu ada banyak jawaban lain, tetapi berikut adalah cara lain untuk melakukannya dengan menggunakan sortdan rle. Fungsi ini rleadalah singkatan dari Run Length Encoding . Ini dapat digunakan untuk menghitung jumlah angka (lihat dokumen R man rle), tetapi juga dapat diterapkan di sini.

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

Jika Anda menangkap hasilnya, Anda dapat mengakses panjang dan nilai sebagai berikut:

## 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
steveb
sumber
0

length(unique(df$col)) adalah cara paling sederhana yang bisa saya lihat.

Jeff Henderson
sumber
R mungkin telah banyak berkembang dalam 10 tahun terakhir, sejak saya menanyakan pertanyaan ini.
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")
Michael Wise
sumber