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)])
hist
.table
tampaknya sedikit lebih lambat darihist
. Kenapa ya. Adakah yang bisa mengkonfirmasi?order()
hasil. yaitux <- as.data.frame(table(dummyData)); x[order(x$Freq, decreasing = TRUE), ]
Jika Anda memiliki beberapa faktor (= bingkai data multi-dimensi), Anda dapat menggunakan
dplyr
paket 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 datadata
.sumber
data %>% count(factor1, factor2)
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
sumber
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]
sumber
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 .sumber
Ini berhasil untuk saya. Ambil vektor Anda
v
length(summary(as.factor(v),maxsum=50000))
Komentar: setel makssum agar cukup besar untuk menangkap jumlah nilai unik
atau dengan
magrittr
paketnyav %>% as.factor %>% summary(maxsum=50000) %>% length
sumber
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))
sumber
ddply(data_frame, .(v), count)
. Juga patut diperjelas bahwa Anda memerlukanlibrary("plyr")
panggilan untuk membuatnyaddply
bekerja.transform
daripadamutate
saat menggunakanplyr
.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
sumber
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
sumber
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) }
sumber
Saya tahu ada banyak jawaban lain, tetapi berikut adalah cara lain untuk melakukannya dengan menggunakan
sort
danrle
. Fungsi inirle
adalah singkatan dari Run Length Encoding . Ini dapat digunakan untuk menghitung jumlah angka (lihat dokumen R manrle
), 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
sumber
length(unique(df$col))
adalah cara paling sederhana yang bisa saya lihat.sumber
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")
sumber