প্রতিটি গ্রুপের মধ্যে সারি সংখ্যা গণনা করুন


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 টি কার্য যেমন: + গণনা)? আমি একটি কলামের গড় এবং অন্যান্য কলাম একই মান জন্য সারির সংখ্যা পেতে প্রয়োজন
রুটির

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, গ্রেগস্নো অনুসরণ করে:

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()ডেটা.ফ্রেমে ডেটা.ট্যাবেলে রূপান্তর করতে। সুতরাং এক পদক্ষেপে setDT(df)[, .N, by = .(year, month)]
সিন্ড্রি_বলদুর

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)কাজ করবে।
থাইল্যান্ডেল

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 এর কোনও পর্যবেক্ষণ নেই contains

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)

4

একজন sqldfপ্যাকেজ ব্যবহার করে সমাধান :

library(sqldf)
sqldf("SELECT Year, Month, COUNT(*) as Freq
       FROM df1
       GROUP BY Year, Month")

1

@ বেন উত্তরটি বিবেচনা করে, আর কলামটি df1না রাখলে একটি ত্রুটি নিক্ষেপ করবে x। তবে এর সাথে মার্জিতভাবে সমাধান করা যেতে পারে 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)

এক বা উভয় ভেরিয়েবলের উপর।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.