Считайте уникальные значения
Скажем, у меня есть:
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)])
Ответы
Ответ 1
Возможно, таблица - это то, что вам нужно?
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
Ответ 2
Это однострочный подход, используя aggregate
.
> aggregate(data.frame(count = v), list(value = v), length)
value count
1 1 25
2 2 75
Ответ 3
Если у вас есть несколько факторов (= многомерный кадр данных), вы можете использовать пакет dplyr
для подсчета уникальных значений в каждой комбинации факторов:
library("dplyr")
data %>% group_by(factor1, factor2) %>% summarize(count=n())
Он использует оператор трубы %>%
для вызова целых методов в фрейме данных data
.
Ответ 4
Чтобы получить не-размерный целочисленный вектор, содержащий количество уникальных значений, используйте c()
.
dummyData = rep(c(1, 2, 2, 2), 25) # Chase 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]
, размещенном в комментарии к ответу Chase. Спасибо Рикардо Сапорте, который указал мне на это здесь.
Ответ 5
Функция table() - это хороший способ, как предлагалось Chase.
Если вы анализируете большой набор данных, альтернативный способ - использовать функцию .N в datatable пакете.
Убедитесь, что вы установили пакет таблиц данных на
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]
Ответ 6
Если вам нужно указать количество уникальных значений в качестве дополнительного столбца в фрейме данных, содержащем ваши значения (столбец, который может представлять пример размера выборки, например), 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))
Ответ 7
Если вы хотите запускать уникальный файл 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)
}
Ответ 8
Это работает для меня. Возьмите свой вектор v
length(summary(as.factor(v),maxsum=50000))
Комментарий: установите maxsum достаточно большим, чтобы зафиксировать количество уникальных значений
или с пакетом magrittr
v %>% as.factor %>% summary(maxsum=50000) %>% length
Ответ 9
Также будет выполняться категоризация и значения summary()
.
> v = rep(as.factor(c(1,2, 2, 2)), 25)
> summary(v)
1 2
25 75
Ответ 10
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")