प्रत्येक अद्वितीय मान के लिए आवृत्तियों की संख्या की गणना करें


140

मान लीजिए कि मेरे पास है:

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)])

जवाबों:


179

शायद टेबल आप के बाद क्या है?

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
आह, हाँ, मैं इसे कुछ मामूली संशोधन के साथ उपयोग कर सकता हूं: t (as.data.frame (तालिका (v)) [, 2]) बिल्कुल वही है
जिसकी

1
मैं इसके साथ अजीब तरह से करता था histtableकी तुलना में थोड़ा धीमा लगता है hist। मुझे आश्चर्य है क्योंकि। क्या कोई पुष्टि कर सकता है?
23

2
चेस, आवृत्ति द्वारा ऑर्डर करने का कोई मौका? मेरे पास ठीक यही समस्या है, लेकिन मेरी तालिका में लगभग 20000 प्रविष्टियां हैं और मैं जानना चाहता हूं कि सबसे आम प्रविष्टियां कितनी बार होती हैं।
टॉरवॉन

5
@Torvon - यकीन है, बस order()परिणामों पर उपयोग करें । अर्थातx <- as.data.frame(table(dummyData)); x[order(x$Freq, decreasing = TRUE), ]
चेस

यह तरीका अच्छा नहीं है, यह केवल बहुत कम डेटा के लिए बहुत बार-बार फिट है, यह कुछ डुप्लिकेट किए गए रिकॉर्ड के साथ बहुत अधिक डेटा को फिट नहीं करेगा।
डीप नॉर्थ

26

यदि आपके पास कई कारक हैं (= एक बहुआयामी डेटा फ़्रेम), तो आप dplyrकारकों के प्रत्येक संयोजन में अद्वितीय मूल्यों को गिनने के लिए पैकेज का उपयोग कर सकते हैं :

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

यह %>%डाटा फ्रेम पर चेन ऑपरेटर कॉल को पाइप ऑपरेटर का उपयोग करता है data


21

यह उपयोग करके एक-लाइन दृष्टिकोण है aggregate

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

  value count
1     1    25
2     2    75

11

तालिका () फ़ंक्शन जाने का एक अच्छा तरीका है, जैसा कि चेज़ ने सुझाव दिया था। यदि आप एक बड़े डेटासेट का विश्लेषण कर रहे हैं, तो एक वैकल्पिक तरीका उपयोग करना है। डेटा योग्य पैकेज में .N फ़ंक्शन।

सुनिश्चित करें कि आपने डेटा टेबल पैकेज स्थापित किया है

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]

8

एक अन-डायमेंशनल पूर्णांक वेक्टर प्राप्त करने के लिए जिसमें अद्वितीय मानों की गिनती होती है, उपयोग करें 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"

यह उपयोगी हो सकता है यदि आपको किसी अन्य फ़ंक्शन में अनन्य मानों की गणना करने की आवश्यकता है, और t(as.data.frame(table(dummyData))[,2]चेस के जवाब में एक टिप्पणी में पोस्ट की तुलना में कम और अधिक मुहावरेदार है । रिकार्डो सपोर्टा का शुक्रिया जिन्होंने मुझे यहां बताया ।


7

यह मेरे लिए काम करता है। अपने वेक्टर ले लोv

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

टिप्पणी: अनूठे मानों की संख्या पर कब्जा करने के लिए अधिकतम बड़ा सेट करें

या magrittrपैकेज के साथ

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


4

यदि आपको अपने मान वाले डेटा फ़्रेम में एक अतिरिक्त स्तंभ के रूप में अद्वितीय मानों की संख्या की आवश्यकता है (एक स्तंभ जो उदाहरण के लिए नमूना आकार का प्रतिनिधित्व कर सकता है), प्लाई एक साफ तरीका प्रदान करता है:

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
या ddply(data_frame, .(v), count)। यह भी स्पष्ट करने के लायक है कि आपको काम library("plyr")करने के लिए कॉल की आवश्यकता है ddply
ब्रायन डिग्स

उपयोग transformकरते mutateसमय उपयोग करने के लिए अजीब लगता है plyr
ग्रेगर थॉमस

3

इसके अलावा मूल्यों को श्रेणीबद्ध करना और कॉल summary()करना काम करेगा।

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

2

आप भी एक कोशिश कर सकते हैं tidyverse

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

0

यदि आप किसी 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)                                                                                                                                                                                           
}  

0

लंबाई (अद्वितीय $ df) मैं देख सकता हूँ सबसे सरल तरीका है।


आर शायद पिछले 10 वर्षों में बहुत विकसित हुआ है, जब से मैंने यह सवाल पूछा है।
गकेरा

-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")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.