Policz liczbę wystąpień dla każdej unikalnej wartości
Powiedzmy, że mam:
v = rep(c(1,2, 2, 2), 25)
Teraz chcę policzyć, ile razy pojawia się każda unikalna wartość. unique(v)
zwraca, jakie są unikalne wartości, ale nie ile ich jest.
> unique(v)
[1] 1 2
I want something that gives me
length(v[v==1])
[1] 25
length(v[v==2])
[1] 75
Ale jako bardziej ogólne jednoliniowe:) coś bliskiego (ale nie do końca) jak to:
#<doesn't work right> length(v[v==unique(v)])
13 answers
Być może stół jest tym, czego szukasz?
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-26 00:37:46
Jeśli masz wiele czynników (=wielowymiarowa ramka danych), możesz użyć pakietu dplyr
, aby zliczyć unikalne wartości w każdej kombinacji czynników:
library("dplyr")
data %>% group_by(factor1, factor2) %>% summarize(count=n())
Używa operatora rury %>%
do łańcuchowania wywołań metod na ramce danych data
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-07 19:08:29
Jest to podejście Jednowierszowe za pomocą aggregate
.
> aggregate(data.frame(count = v), list(value = v), length)
value count
1 1 25
2 2 75
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-12 20:09:56
Funkcja Table() jest dobrym rozwiązaniem, jak zasugerował Chase. Jeśli analizujesz duży zbiór danych, alternatywnym sposobem jest użycie .Funkcja n w pakiecie datatable.
Upewnij się, że zainstalowałeś pakiet tabel danych przez
install.packages("data.table")
Kod:
# 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]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:29
Aby uzyskać nie wymiarowany wektor całkowity zawierający liczbę unikalnych wartości, użyj 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"
Może się to przydać, jeśli trzeba wprowadzić liczby unikalnych wartości do innej funkcji, i jest krótszy i bardziej idiomatyczny niż t(as.data.frame(table(dummyData))[,2]
opublikowany w komentarzu do odpowiedzi Chase ' a. Dzięki Ricardo Saporcie, który zwrócił mi to uwagę tutaj .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:29
To mi pasuje. Weź swój wektor v
length(summary(as.factor(v),maxsum=50000))
Komentarz: Ustaw maxsum, aby było wystarczająco duże, aby uchwycić liczbę unikalnych wartości
Lub z magrittr
pakietem
v %>% as.factor %>% summary(maxsum=50000) %>% length
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-04 00:17:30
Jeśli chcesz mieć liczbę unikalnych wartości jako dodatkową kolumnę w ramce danych zawierającej twoje wartości (kolumna, która może reprezentować na przykład rozmiar próbki), plyr zapewnia schludny sposób:
data_frame <- data.frame(v = rep(c(1,2, 2, 2), 25))
library("plyr")
data_frame <- ddply(data_frame, .(v), transform, n = length(v))
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-28 10:58:55
Również nadanie wartości kategorycznych i wywołanie summary()
zadziałałoby.
> v = rep(as.factor(c(1,2, 2, 2)), 25)
> summary(v)
1 2
25 75
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-17 02:06:31
Możesz spróbować również tidyverse
library(tidyverse)
dummyData %>%
as.tibble() %>%
count(value)
# A tibble: 2 x 2
value n
<dbl> <int>
1 1 25
2 2 75
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-28 08:56:55
length(unique(df$col))
to najprostszy sposób, jaki widzę.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-22 15:14:47
Jeśli chcesz uruchomić unique na danych.rama (np. pociąg.dane), a także uzyskać zliczenia (które mogą być używane jako waga w klasyfikatorach), można wykonać następujące czynności:
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)
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-17 06:17:59
Wiem, że jest wiele innych odpowiedzi, ale tutaj jest inny sposób, aby to zrobić za pomocą funkcji sort
i rle
. Funkcja rle
oznacza Run Length Encoding . Może być używany do zliczania przebiegów liczb (Zobacz dokumenty r man na rle
), ale może być również stosowany tutaj.
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
Jeśli przechwycisz wynik, możesz uzyskać dostęp do długości i wartości w następujący sposób:
## 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-07 07:06:58
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")
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-22 07:49:22