प्रत्येक समूह के भीतर पंक्तियों की संख्या की गणना करें


121

मेरे पास एक डेटाफ्रेम है और मैं प्रत्येक समूह के भीतर पंक्तियों की संख्या गिनना चाहूंगा। मैं aggregateइस प्रकार से डेटा को योग करने के लिए फ़ंक्शन का उपयोग नियमित रूप से करता हूं :

df2 <- aggregate(x ~ Year + Month, data = df1, sum)

अब, मैं टिप्पणियों को गिनना चाहूंगा, लेकिन इसके लिए उचित तर्क नहीं खोज सकता FUN। सहज रूप से, मैंने सोचा कि यह इस प्रकार होगा:

df2 <- aggregate(x ~ Year + Month, data = df1, count)

लेकिन, ऐसी किस्मत नहीं।

कोई विचार?


कुछ खिलौना डेटा:

set.seed(2)
df1 <- data.frame(x = 1:20,
                  Year = sample(2012:2014, 20, replace = TRUE),
                  Month = sample(month.abb[1:3], 20, replace = TRUE))

17
nrow, NROW, length...
यहोशू उलरिच

15
मैं इस सवाल को चीजों को गिनने के मज़ेदार तरीके के रूप में पढ़ता रहता हूं (जैसा कि कई निराधार तरीकों के विपरीत है, मुझे लगता है)।
हांग ओई

6
@JoshuaUlrich: nrowमेरे लिए काम लेकिन नहीं किया NROWऔर lengthकाम ठीक। +1
प्रोलिक्स

जवाबों:


69

वर्तमान सबसे अच्छा अभ्यास (स्पष्ट) है:

require(dplyr)
df1 %>% count(Year, Month)

क्या एक चर को एकत्र करने और गणना करने का एक तरीका भी है (जैसे एकत्रीकरण में 2 कार्य: माध्य + गणना)? मुझे एक कॉलम का मतलब और दूसरे कॉलम में समान मान के लिए पंक्तियों की संख्या प्राप्त करने की आवश्यकता है
sop

1
मैं चाहते cbindके परिणाम aggregate(Sepal.Length ~ Species, iris, mean)औरaggregate(Sepal.Length ~ Species, iris, length)
geotheory

मैंने इसे किया है, लेकिन ऐसा लगता है कि मुझे प्रत्येक कॉलम को 2 गुना मिलता है, केवल एक को छोड़कर; ताकि मैं उनके लिए किसी मर्ज किया है और इसे होने की ठीक लगता है
एसओपी

6
मुझे नहीं पता, लेकिन यह भी उपयोगी हो सकता है ...df %>% group_by(group, variable) %>% mutate(count = n())
मनोज कुमार

1
हाँ dplyr अब सबसे अच्छा अभ्यास है।
जियोथेट्री

67

@ जोशुआ के सुझाव के बाद, यहाँ एक तरीका है कि आप अपने dfडेटाफ़्रेम में टिप्पणियों की संख्या की गणना कर सकते हैं जहाँ Year= 2007 और Month= नवंबर (यह मानते हुए कि वे कॉलम हैं):

nrow(df[,df$YEAR == 2007 & df$Month == "Nov"])

और aggregate@GregSnow के साथ:

aggregate(x ~ Year + Month, data = df, FUN = length)

47

dplyrपैकेज count/ tallyआदेशों या n()फ़ंक्शन के साथ ऐसा करता है :

सबसे पहले, कुछ डेटा:

df <- data.frame(x = rep(1:6, rep(c(1, 2, 3), 2)), year = 1993:2004, month = c(1, 1:11))

अब गिनती:

library(dplyr)
count(df, year, month)
#piping
df %>% count(year, month)

हम पाइपिंग और n()फ़ंक्शन के साथ थोड़ा लंबा संस्करण भी उपयोग कर सकते हैं :

df %>% 
  group_by(year, month) %>%
  summarise(number = n())

या tallyसमारोह:

df %>% 
  group_by(year, month) %>%
  tally()

37

data.tableसमाधान के बिना एक पुराना सवाल । तो यहाँ जाता है ...

का उपयोग करते हुए .N

library(data.table)
DT <- data.table(df)
DT[, .N, by = list(year, month)]

1
मानक के .()बजाय आजकल का उपयोग करने के लिए list()और setDT()data.table के लिए एक data.frame कन्वर्ट करने के लिए। तो एक कदम में setDT(df)[, .N, by = .(year, month)]
sindri_baldur

23

के साथ उपयोग करने का सरल विकल्प aggregateवह lengthफ़ंक्शन है जो आपको सबसेट में वेक्टर की लंबाई देगा। कभी-कभी उपयोग करने के लिए थोड़ा अधिक मजबूत होता है function(x) sum( !is.na(x) )


18

Countप्रत्येक पंक्ति के लिए 1 के मान के साथ एक नया चर बनाएँ :

df1["Count"] <-1

फिर Countकॉलम द्वारा सारांशित डेटाफ्रेम एकत्र करें:

df2 <- aggregate(df1[c("Count")], by=list(Year=df1$Year, Month=df1$Month), FUN=sum, na.rm=TRUE)

बस ध्यान रखें कि यदि आप डिफ़ॉल्ट का उपयोग कर रहे हैं, के लिए गैर-सूत्र विधि aggregate, वहाँ में प्रत्येक चर नाम बदलने के लिए कोई जरूरत नहीं है by=की तरह list(year=df1$year)आदि एक data.frameएक है listपहले से ही ऐसा aggregate(df1[c("Count")], by=df1[c("Year", "Month")], FUN=sum, na.rm=TRUE)काम करेंगे।
Thelatemail

17

के लिए एक वैकल्पिक aggregate()इस मामले में समारोह होगा table()साथ as.data.frame()जो भी संकेत मिलता है जो वर्ष और माह के संयोजन शून्य घटनाओं के साथ जुड़े रहे

df<-data.frame(x=rep(1:6,rep(c(1,2,3),2)),year=1993:2004,month=c(1,1:11))

myAns<-as.data.frame(table(df[,c("year","month")]))

और शून्य-घटित संयोजनों के बिना

myAns[which(myAns$Freq>0),]

7

यदि आप महीने-साल के लिए 0 गणना को शामिल करना चाहते हैं जो डेटा में गायब हैं, तो आप थोड़ा tableजादू का उपयोग कर सकते हैं ।

data.frame(with(df1, table(Year, Month)))

उदाहरण के लिए, प्रश्न में df1 के खिलौना डेटा.फ्रेम, में जनवरी 2014 का कोई अवलोकन नहीं है।

df1
    x Year Month
1   1 2012   Feb
2   2 2014   Feb
3   3 2013   Mar
4   4 2012   Jan
5   5 2014   Feb
6   6 2014   Feb
7   7 2012   Jan
8   8 2014   Feb
9   9 2013   Mar
10 10 2013   Jan
11 11 2013   Jan
12 12 2012   Jan
13 13 2014   Mar
14 14 2012   Mar
15 15 2013   Feb
16 16 2014   Feb
17 17 2014   Mar
18 18 2012   Jan
19 19 2013   Mar
20 20 2012   Jan

बेस आर aggregateफ़ंक्शन जनवरी 2014 के लिए एक अवलोकन नहीं लौटाता है।

aggregate(x ~ Year + Month, data = df1, FUN = length)
  Year Month x
1 2012   Feb 1
2 2013   Feb 1
3 2014   Feb 5
4 2012   Jan 5
5 2013   Jan 2
6 2012   Mar 1
7 2013   Mar 3
8 2014   Mar 2

यदि आप गणना के रूप में इस महीने-वर्ष का अवलोकन 0 के साथ करना चाहते हैं, तो उपरोक्त कोड सभी माह-वर्ष के संयोजनों के लिए डेटा के साथ वापस आ जाएगा।

data.frame(with(df1, table(Year, Month)))
  Year Month Freq
1 2012   Feb    1
2 2013   Feb    1
3 2014   Feb    5
4 2012   Jan    5
5 2013   Jan    2
6 2014   Jan    0
7 2012   Mar    1
8 2013   Mar    3
9 2014   Mar    2

5

अपने एकत्रीकरण के लिए मैं आमतौर पर माध्य देखना चाहता हूं और "यह समूह कितना बड़ा है" (उर्फ लंबाई)। तो यह उन अवसरों के लिए मेरा आसान स्निपेट है;

agg.mean <- aggregate(columnToMean ~ columnToAggregateOn1*columnToAggregateOn2, yourDataFrame, FUN="mean")
agg.count <- aggregate(columnToMean ~ columnToAggregateOn1*columnToAggregateOn2, yourDataFrame, FUN="length")
aggcount <- agg.count$columnToMean
agg <- cbind(aggcount, agg.mean)


1

अगर df1कोई xकॉलम नहीं होता है, तो @ जवाब का ध्यान रखते हुए, R एक त्रुटि फेंक देगा । लेकिन इसे सुरुचिपूर्ण ढंग से हल किया जा सकता है paste:

aggregate(paste(Year, Month) ~ Year + Month, data = df1, FUN = NROW)

यदि समूह में दो से अधिक चर का उपयोग किया जाता है, तो इसी तरह, इसे सामान्यीकृत किया जा सकता है:

aggregate(paste(Year, Month, Day) ~ Year + Month + Day, data = df1, FUN = NROW)

0

आप ऐसे byकार्यों का उपयोग कर सकते हैं by(df1$Year, df1$Month, count)जो आवश्यक एकत्रीकरण की सूची तैयार करेंगे।

आउटपुट जैसा दिखेगा,

df1$Month: Feb
     x freq
1 2012    1
2 2013    1
3 2014    5
--------------------------------------------------------------- 
df1$Month: Jan
     x freq
1 2012    5
2 2013    2
--------------------------------------------------------------- 
df1$Month: Mar
     x freq
1 2012    1
2 2013    3
3 2014    2
> 

0

यहाँ पहले से ही बहुत सारे शानदार उत्तर हैं, लेकिन मैं मूल डेटासेट में नया कॉलम जोड़ने के इच्छुक लोगों के लिए 1 और विकल्प में फेंकना चाहता था जिसमें पंक्ति को बार-बार दोहराया जाता है।

df1$counts <- sapply(X = paste(df1$Year, df1$Month), 
                     FUN = function(x) { sum(paste(df1$Year, df1$Month) == x) })

merge()फ़ंक्शन के साथ उपरोक्त उत्तरों में से किसी को भी जोड़कर इसे पूरा किया जा सकता है ।


0

यदि आपके ऊपर कुल समाधान की कोशिश कर रहा है और आपको त्रुटि मिलती है:

चर के लिए अमान्य प्रकार (सूची)

क्योंकि आप दिनांक या डेटाइम स्टैम्प का उपयोग कर रहे हैं, चर पर as.character का उपयोग करने का प्रयास करें:

aggregate(x ~ as.character(Year) + Month, data = df, FUN = length)

एक या दोनों चरों पर।

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