Her bir benzersiz değer için olay sayısını sayın


140

Diyelim ki:

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

Şimdi, her bir benzersiz değerin kaç kez göründüğünü saymak istiyorum. unique(v) benzersiz değerlerin ne olduğunu döndürür, ancak kaç tane olduklarını döndürmez.

> unique(v)
[1] 1 2

Bana veren bir şey istiyorum

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

ama daha genel bir astar olarak :) Böyle bir şey (ama tam olarak değil) şöyle:

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

Yanıtlar:


179

Belki de peşinde olduğun şey tablodur?

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
Ah, evet, bunu küçük bir değişiklikle kullanabilirim: t (as.data.frame (tablo (v)) [, 2]) tam olarak ihtiyacım olan şey, teşekkür ederim
gakera 18:30

1
Bunu garip bir şekilde yapardım hist.tablebiraz daha yavaş görünüyor hist. Nedenini merak ediyorum. Herkes onaylayabilir mi?
Museful

2
Chase, frekansa göre sipariş verme şansı var mı? Aynı sorun var, ama benim tablo kabaca 20000 girişleri vardır ve en yaygın girişlerin ne sıklıkta olduğunu bilmek istiyorum.
Torvon

5
@Torvon - elbette, sadece order()sonuçları kullanın . iex <- as.data.frame(table(dummyData)); x[order(x$Freq, decreasing = TRUE), ]
Chase

Bu yöntem iyi değildir, sadece çok fazla tekrarlanan çok az veri için uygundur, az sayıda yinelenen kayıt ile çok fazla sürekli veri sığmaz.
Derin Kuzey

26

Birden çok faktörünüz varsa (= çok boyutlu bir veri çerçevesi), dplyrher bir faktör kombinasyonundaki benzersiz değerleri saymak için paketi kullanabilirsiniz :

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

%>%Veri çerçevesindeki yöntem çağrılarını zincirlemek için boru operatörünü kullanır data.


21

Kullanarak tek satırlık bir yaklaşımdır aggregate.

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

  value count
1     1    25
2     2    75

11

Chase'in önerdiği gibi table () işlevi iyi bir yoldur . Büyük bir veri kümesini analiz ediyorsanız, alternatif bir yol da datatable paketinde .N işlevini kullanmaktır.

Veri tablosu paketini şu şekilde yüklediğinizden emin olun:

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]

8

Benzersiz değerlerin sayısını içeren boyutsuz bir tamsayı vektörü almak için kullanın 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"

Benzersiz değerlerin sayısını başka bir işleve beslemeniz gerekiyorsa ve t(as.data.frame(table(dummyData))[,2]Chase'in cevabına yapılan bir yorumda yayınlanandan daha kısa ve daha deyimselse, bu yararlı olabilir . Burada bana dikkat çeken Ricardo Saporta'ya teşekkürler .


7

Bu benim için çalışıyor. Vektörünü alv

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

Yorum: maksimum değeri benzersiz değerlerin sayısını yakalayacak kadar büyük olacak şekilde ayarlayın

veya magrittrpaketle

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


4

Veri çerçevesinde değerlerinizi içeren ek bir sütun olarak benzersiz değerlerinizin olması gerekiyorsa (örneğin örnek boyutunu temsil edebilecek bir sütun), plyr düzgün bir yol sağlar:

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
veya ddply(data_frame, .(v), count). Ayrıca iş library("plyr")yapmak için bir çağrıya ihtiyacınız olduğunu açıkça belirtmeye değer ddply.
Brian Diggs

Kullanmak transformyerine kullanmak garip görünüyor . mutateplyr
Gregor Thomas

3

Ayrıca değerleri kategorik ve çağrı yapmak summary()da işe yarayacaktır.

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

2

Ayrıca bir tidyverse

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

0

Bir data.frame üzerinde benzersiz çalıştırmak (ör. Train.data) ve ayrıca sayıları (sınıflandırıcılarda ağırlık olarak kullanılabilir) almak istiyorsanız, aşağıdakileri yapabilirsiniz:

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

uzunluk (benzersiz (df $ col)) görebildiğim en basit yol.


Bu soruyu sorduğumdan beri R son 10 yılda muhtemelen çok gelişti.
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")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.