توابع جمع‌ بندی و گروه بندی (Summarise, Group_by) در R — راهنمای کاربردی

۱۱۴۴ بازدید
آخرین به‌روزرسانی: ۰۷ خرداد ۱۴۰۲
زمان مطالعه: ۱۳ دقیقه
توابع جمع‌ بندی و گروه بندی (Summarise, Group_by) در R — راهنمای کاربردی

یکی از روش‌های خلاصه کردن داده‌ها، جمعی‌بندی (Aggregation) است. با استفاده از این روش برای یک گروه از داده‌ها، یک نماینده انتخاب می‌شود. به این ترتیب می‌توان توزیع احتمالی یا فراوانی یک متغیر کمی را به تفکیک سطوح مختلف یک متغیر کیفی یا طبقه‌ای (Categorical Variable) بدست آورد. در این نوشتار به بررسی دو تابع معروف در زبان برنامه‌نویسی آماری R به نام‌های $$summarise()$$ و $$group\_by()$$ خواهیم پرداخت. در این میان از کتابخانه‌ dplyr استفاده خواهیم کرد. بنابراین شاید مطالعه مطلب تبدیل و پاکسازی داده‌ ها با کتابخانه dplyr و tidyr در R — راهنمای کاربردی خالی از لطف نباشد. اکنون و در ادامه به توابع جمع بندی پیش‌تر اشاره شده خواهیم پرداخت.

توابع جمع‌ بندی (Aggregation Functions)

به عنوان یک «تحلیل‌گر داده» (Data Scientist) باید توانایی تغییر ساختار و شاخص‌سازی برای یک «مجموعه داده» (Dataset) را داشته باشید. بخصوص اگر از زبان‌برنامه نویسی R استفاده می‌کنید، این کار به صورت معمول در همه تحلیل‌ها، ضرورت خواهد داشت.

برای آشنایی با این گونه توابع از یک بانک اطلاعاتی به نام batting_lahman.csv که در (+) قرار دارد، استفاده خواهیم کرد. این مجموعه داده شامل 20563 مشاهده و ۲۲ متغیر است. البته بعضی از این متغیرها را در اینجا به کار خواهیم گرفت. متغیرهایی که در این نوشتار به آن‌ها می‌پردازیم در زیر فهرست شده‌اند.

نام متغیرشرح
playerIDشماره بازیکن (از نوع عامل)
teamIDکد تیم (از نوع عامل)
lgIDکد مسابقات (از نوع عامل با سطوح AA, AL, FL, NL, PL, UA)
ABتعداد قرارگیری در پست At bats (عددی)
Gتعداد بازی‌های هر بازیکن (عددی)
Rتعداد Runها (عددی)
HRتعداد بازی‌های خانگی (عددی)
SHتعداد ضربه‌های sacrifice

برای شروع کار گام‌های زیر را باید برداریم تا به مجموعه داده دلخواه با متغیرهایی که در بالا ذکر شده دست پیدا کنیم.

  • گام اول: داده‌ها را وارد کنیم.
  • گام دوم: متغیرهای مورد نظر را انتخاب کنیم.
  • گام سوم: داده‌ها را مرتب کنیم.

این گام‌ها در کد زیر پیاده‌سازی شده‌اند. همانطور که می‌بینید، کتابخانه dplyr در اینجا نقش مهمی دارد.

1library(dplyr)
2
3# Step 1
4data <- read.csv("https://raw.githubusercontent.com/thomaspernet/data_csv_r/master/data/batting_lahman.csv") % > % 
5
6#Step 2
7select(c(playerID, yearID, AB, teamID, lgID, G, R, HR, SH)) % > % 
8
9#Step 3
10arrange(playerID, teamID, yearID)

برای مشاهده بخشی از داده‌ها بهتر است از دستور (glimpse(data استفاده کنیم. نتیجه به صورت زیر خواهد بود.

1## Observations: 20,563
2## Variables: 9
3## $ playerID <fctr> aardsda01, aardsda01, aaronha01, aaronha01, aaronha0...
4## $ yearID   <int> 2009, 2010, 1973, 1957, 1962, 1975, 1986, 1979, 1980,...
5## $ AB       <int> 0, 0, 392, 615, 592, 465, 0, 0, 0, 0, 0, 0, 45, 610, ...
6## $ teamID   <fctr> SEA, SEA, ATL, ML1, ML1, ML4, BAL, CAL, CAL, CAL, LA...
7## $ lgID     <fctr> AL, AL, NL, NL, NL, AL, AL, AL, AL, AL, NL, AL, NA, ...
8## $ G        <int> 73, 53, 120, 151, 156, 137, 66, 37, 40, 24, 32, 18, 1...
9## $ R        <int> 0, 0, 84, 118, 127, 45, 0, 0, 0, 0, 0, 0, 3, 70, 20, ...
10## $ HR       <int> 0, 0, 40, 44, 45, 12, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0...
11## $ SH       <int> 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, NA, 5, 8, 0, NA, ...

تابع Summarise

شکل تابع $$summarise()$$ به مانند دیگر توابع کتابخانه dplyr است. با این تابع می‌توان یک متغیر محاسباتی براساس تابعی که معرفی می‌کنید ایجاد کرد.

1summarise(df, variable_name=condition) 
2arguments: 
3- `df`: Dataset used to construct the summary statistics 
4- `variable_name=condition`: Formula to create the new variable

پارامتر اول نام «چارچوب داده» (Data Frame) و پارامتر دوم نام متغیر و نحوه محاسبه این متغیر جدید است. برای مثال اگر قرار باشد که میانگین متغیر R را در چارچوب داده data محاسبه کرده و در متغیر mean_run قرار دهیم، باید شکل دستوری summarise به صورت زیر نوشته شود.

1summarise(data, mean_run =mean(R))

نتیجه ایجاد متغیر mean_run با مقدار 19.20144 خواهد بود. همین کار را برای متغیرهای دیگر نیز می‌توان در یک دستور انجام داد. برای مثال، کد زیر میانگین را برای متغیرهای G و SH محاسبه می‌کند. البته برای متغیر SH‌ پارامتر na.rm=TRUE نشان می‌دهد که باید مقادیر ناموجود (گمشده) که با NA در مجموعه داده data ثبت شده‌اند حذف و سپس محاسبه میانگین صورت گیرد.

1summarise(data, mean_games = mean(G),
2    mean_SH = mean(SH, na.rm = TRUE))

گروه بندی با group_by

اگر هدف از اجرای تابع $$summarise()$$ جمع‌بندی براساس گروه‌ها باشد باید از group_by نیز استفاده کرد. به این ترتیب آماره‌های توصیفی به تفکیک متغیر گروه‌بندی ایجاد می‌شود. ترکیب این تابع با توابع دیگر مانند mutate و filter و arrange بسیار کاربردی و موثر است.

در اینجا استفاده از «عملگر سلسله‌ای» (Pipeline Operator) بخصوص زمانی که مراحل زیاد باشند، مناسب به نظر می‌رسد. در ادامه با استفاده از این عملگر و تابع group_by و summarise محاسبات را انجام داده‌ایم.

1data %>%
2	group_by(lgID) % > %
3	summarise(mean_run = mean(HR))

همانطور که دیده می‌شود، مجموعه داده data وارد فیلتر group_by شده و محاسبات مربوط به میانگین متغیر HR به تفکیک متغیر lgID ثبت خواهد شد. در نتیجه خروجی شامل ۷ سطر است که میانگین متغیر HR را در سطوح مختلف متغیر lgID مشخص می‌کند.

1## 
2# A tibble: 7 x 2
3##     lgID  mean_run
4##   <fctr>     <dbl>
5## 1     AA 0.9166667
6## 2     AL 3.1270988
7## 3     FL 1.3131313
8## 4     NL 2.8595953
9## 5     PL 2.5789474
10## 6     UA 0.6216216
11## 7   <NA> 0.2867133

از عملگر سلسله‌ای در تابع ggplot از کتابخانه ggplot2 نیز می‌توان استفاده کرد. به این ترتیب می‌توان محاسباتی که توسط summarise صورت گرفته را در نمودار به کار برد. فرض کنید می‌خواهیم میانگین متغیر HR را به تفکیک سطوح متغیر lgID روی یک نمودار میله‌ای (Bar Chart) نمایش دهیم. مراحل زیر برای انجام چنین کاری باید طی شود.

  • انتخاب چارچوب داده (Data Frame)
  • دسته‌بندی کردن داده‌ها (Group Data)
  • محاسبه شاخص جمع‌بندی (Summarize the Data)
  • رسم نمودار شاخص محاسبه شده (Plot the Summary Statistics)

این گام‌ها در کد زیر انجام شده است. توجه داشته باشید که از کتابخانه ggplot2 استفاده کرده‌ایم.

1library(ggplot2)
2# Step 1
3data %>% 
4#Step 2
5group_by(lgID) %>% 
6#Step 3
7summarise(mean_home_run = mean(HR)) %>% 
8#Step 4
9ggplot(aes(x = lgID, y = mean_home_run, fill = lgID)) +
10    geom_bar(stat = "identity") +
11    theme_classic() +
12    labs(
13        x = "baseball league",
14        y = "Average home run",
15        title = paste(
16            "Example group_by() with summarise()"
17        )
18    )

خروجی با اجرای این کد به صورت زیر در خواهد آمد. مشخص است که مراحل اولیه تا قبل از اجرای فرمان ggplot به منظور طبقه‌بندی و جمع‌بندی صورت گرفته و در گام آخر رسم نمودار انجام شده است.

Aggregate and plotting

توابع محاسباتی در Summarise

تقریبا همه توابع محاسباتی در summarise قابلیت استفاده دارند. در ادامه به لیست کوتاهی از توابع معمول که در summarise به کار می‌روند اشاره می‌کنیم. توجه دارید که این لیست شامل توابعی است که خروجیشان به صورت یک عدد ظاهر خواهد شد.

نوع تابعشیوه محاسبهتابع
پایه‌میانگینmean()
میانهmedian()
جمعsum()
پراکندگیانحراف استانداردsd()
دامنه میان چارکیIQR()
دامنهحداقلmin()
حداکثرmax()
چندکquantile()
موقعیتمقدار اولین موقعیت (اولین مقدار)first()
مقدار آخرین موقعیت (آخرین مقدار)last()
مقدار nامین موقعیتnth()
شمارششمارش تعداد سطرهاn()
شمارش تعداد مشاهدات مجزاn_distinct()

در ادامه برای هر یک از این حالت‌ها مثال‌هایی خواهیم دید.

توابع پایه

در کدهایی که تا به حال در این نوشتار دیدید، نتایج محاسبه شاخص‌های جمع‌بندی و summarise در متغیری ثبت نشد. حال نتیجه محاسبات با summarise را درون یک «چارچوب داده» (data frame) ثبت و از آن استفاده خواهیم کرد.

در ادامه قصد داریم، میانگین تعداد بازی در هر سال را محاسبه و سپس نمودار مربوط به این موضوع را به صورت یک نمودار خطی ترسیم کنیم.

در گام اول، شاخص میانگین استخراج می‌شود. این کار توسط کد زیر صورت گرفته است:

1## Mean
2ex1 <- data %>%
3	group_by(yearID) %>%
4	summarise(mean_game_year = mean(G))
5head(ex1)

نتیجه اجرای این کار به صورت زیر است. مشخص است که نتیجه محاسبه شاخص میانگین توسط summarise روی گروه‌های تعیین شده توسط group_by برای هر سال استخراج شده و به صورت یک چارچوب داده در ex1 ثبت شده است.

1## # A tibble: 6 x 2
2##   yearID mean_game_year
3##    <int>          <dbl>
4## 1   1871       23.42308
5## 2   1872       18.37931
6## 3   1873       25.61538
7## 4   1874       39.05263
8## 5   1875       28.39535
9## 6   1876       35.90625

در گام دوم برای رسم نمودار از متغیر ایجاد شده کمک گرفته و نمودار خطی ترسیم می‌شود.

1# Plot the graph
2ggplot(ex1, aes(x = yearID, y = mean_game_year)) +
3    geom_line() +
4    theme_classic() +
5    labs(
6        x = "Year",
7        y = "Average games played",
8        title = paste(
9            "Average games played from 1871 to 2016"
10        )
11    )

نمودار خطی مطابق با تصویر زیر ظاهر خواهد شد.

Aggregate and line plotting

درون summarise می‌توان بیش از یک متغیر را محاسبه کرد. در کد زیر علاوه بر محاسبه میانه برای متغیر AB میانه برای داده‌هایی از متغیر AB که غیر صفر هستند نیز محاسبه شده و با میانه قبلی مقایسه شده است. همانطور که دیده می‌شود از نوعی فیلتر به صورت $$[AB>0]$$ برای متغیر AB استفاده کرده‌ایم.

1## Subsetting + Median
2data %>%
3group_by(lgID) %>%
4summarise(median_at_bat_league = median(AB), 
5	#Compute the median without the zero 
6	median_at_bat_league_no_zero = median(AB[AB > 0]))

به این ترتیب خروجی به صورتی است که «میانه» (Median) در هر دو حالت (با احتساب مقدارهای صفر و بدون آن) محاسبه و به تفکیک lgID ظاهر شده است.

1## # A tibble: 7 x 3
2##     lgID median_at_bat_league median_at_bat_league_no_zero
3##   <fctr>                <dbl>                        <dbl>
4## 1     AA                  130                          131
5## 2     AL                   38                           85
6## 3     FL                   88                           97
7## 4     NL                   56                           67
8## 5     PL                  238                          238
9## 6     UA                   35                           35
10## 7   <NA>                  101                          101

در مثال بعدی با استفاده از تابع sum مجموع بازی‌های خانگی هر تیم (HR) به تفکیک کد لیگ مسابقات (lgID) محاسبه شده است.

1## Sum
2data %>%
3	group_by(lgID) %>%
4	summarise(sum_homerun_league = sum(HR))

نکته: همانطور که در خروجی می‌بینید متغیر lgID از نوع فاکتور یا عامل (<fctr>)و متغیر جمع‌بندی sum_homerun_leage عددی (<int>) است.

1## # A tibble: 7 x 2
2##     lgID sum_homerun_league
3##   <fctr>              <int>
4## 1     AA                341
5## 2     AL              29426
6## 3     FL                130
7## 4     NL              29817
8## 5     PL                 98
9## 6     UA                 46
10## 7   <NA>                 41

معیارهای پراکندگی

معمولا برای محاسبه میزان پارکندگی داده‌ها در R از شاخص‌های انحراف استاندارد که توسط تابع sd قابل دسترسی است، کمک می‌گیرند. کد زیر به منظور محاسبه میزان پراکندگی برای HR تهیه شده است.

1# Spread
2data %>%
3	group_by(teamID) %>%
4	summarise(sd_at_bat_league = sd(HR))

نتیجه در ادامه قابل مشاهده است.

1## # A tibble: 148 x 2
2##    teamID sd_at_bat_league
3##    <fctr>            <dbl>
4##  1    ALT               NA
5##  2    ANA        8.7816395
6##  3    ARI        6.0765503
7##  4    ATL        8.5363863
8##  5    BAL        7.7350173
9##  6    BFN        1.3645163
10##  7    BFP        0.4472136
11##  8    BL1        0.6992059
12##  9    BL2        1.7106757
13## 10    BL3        1.0000000
14## # ... with 138 more rows

نکته: اگر می‌خواهید خروجی به صورت مرتب شده برحسب متغیر جمع‌بندی ظاهر شود باید از دستور arrange استفاده کنید. بنابراین برای نمایش انحراف استاندارد بازی‌های خانگی به ترتیب از بزرگ به کوچک دستورات را به صورتی که در ادامه آمده‌ است، وارد و اجرا کنید.

1data %>%
2  group_by(teamID) %>%
3  summarise(sd_at_bat_league = sd(HR)) %>%
4arrange(desc(sd_at_bat_league))

خروجی این قطعه کد در ادامه، دیده می‌شود.

1# A tibble: 148 x 2
2   teamID sd_at_bat_league
3   <fct>             <dbl>
4 1 ML1               10.2 
5 2 MIL                9.53
6 3 COL                9.49
7 4 ANA                8.78
8 5 TOR                8.72
9 6 ATL                8.54
10 7 NYA                8.11
11 8 TEX                7.87
12 9 MIA                7.78
1310 BAL                7.74
14# ... with 138 more rows
15>

مشخص است که تیم ML1 دارای بیشترین انحراف استاندارد برای بازی‌های خانگی است.

معیارهای مرتبط با دامنه

همچنین می‌توان حداکثر و حداقل تعداد بازی‌های هر بازیکن را به همین شکل بدست آورد. به کد زیر توجه کنید.

1# Min and max
2data % > %
3	group_by(playerID) % > %
4	summarise(min_G = min(G),
5    max_G = max(G))

نکته: حتما تا به حال متوجه شده‌اید که با اجرای عملگر سلسله مراتب، احتیاجی به ذکر مجموعه داده data در summarise نیست.

پس از انجام محاسبات، خروجی به صورتی که در ادامه قابل مشاهده است، ظاهر خواهد شد.

1## # A tibble: 10,395 x 3
2##     playerID min_G max_G
3##       <fctr>       <int>
4##  1 aardsda01    53    73
5##  2 aaronha01   120   156
6##  3  aasedo01    24    66
7##  4  abadfe01    18    18
8##  5 abadijo01    11    11
9##  6 abbated01     3   153
10##  7 abbeybe01    11    11
11##  8 abbeych01    80   132
12##  9 abbotgl01     5    23
13## 10 abbotji01    13    29
14## # ... with 10,385 more rows

موقعیت

برای نمایش مقدارها در موقعیت‌های خاص از توابعی مانند first و last‌ استفاده می‌کنیم. فرض کنید که باید برای هر بازیکن، سال شروع به فعالیت ورزشی و سال بازنشستگی را مشخص کنید. این توابع را در summarise به این منظور به کار برده و کدی که در ادامه قابل مشاهده است را ایجاد کرده‌ایم.

1# first and last
2data % > %
3	group_by(playerID) % > %
4	summarise(first_appearance = first(yearID),
5		last_appearance = last(yearID))

خروجی حاصل از اجرای این کد در ادامه قابل مشاهده است.

1## # A tibble: 10,395 x 3
2##     playerID first_appearance last_appearance
3##       <fctr>            <int>           <int>
4##  1 aardsda01             2009            2010
5##  2 aaronha01             1973            1975
6##  3  aasedo01             1986            1990
7##  4  abadfe01             2016            2016
8##  5 abadijo01             1875            1875
9##  6 abbated01             1905            1897
10##  7 abbeybe01             1894            1894
11##  8 abbeych01             1895            1897
12##  9 abbotgl01             1973            1979
13## 10 abbotji01             1992            1996
14## # ... with 10,385 more rows

همینطور برای دسترسی به nامین مشاهده کافی است از تابع ()nth استفاده شود. فرض کنید در مجموعه داده data بخواهیم فقط روی بازی‌هایی که تیم در سال دوم فعالیتش انجام داده تمرکز داشته باشیم. با استفاده از کدی که در ادامه مشاهده می‌کنید این منظور محقق شده است.

1# nth
2data %>%
3	group_by(teamID) %>%
4	summarise(second_game = nth(yearID, 2)) %>%
5	arrange(second_game)

ابتدا بوسیله group_by دسته‌بندی براساس کد تیم صورت گرفته، سپس خروجی براساس دومین «سال بازی» (yearID) هر تیم به صورت نزولی ظاهر خواهد شد. به خروجی توجه کنید.

1## # A tibble: 148 x 2
2##    teamID second_game
3##    <fctr>       <int>
4##  1    BS1        1871
5##  2    CH1        1871
6##  3    FW1        1871
7##  4    NY2        1871
8##  5    RC1        1871
9##  6    BR1        1872
10##  7    BR2        1872
11##  8    CL1        1872
12##  9    MID        1872
13## 10    TRO        1872
14## # ... with 138 more rows

به این ترتیب، متوجه می‌شویم سال ۱۸۷۱ دومین سالی بوده که تیم BS1 در لیگ شرکت کرده بوده است.

شمارش (Count)

برای شمارش تعداد مشاهدات براساس تفکیکی که group_by ایجاد کرده است، از تابع $$n()$$‌ در summarise استفاده می‌کنیم. به کد زیر توجه کنید.

1# count observations
2data %>%
3	group_by(playerID) %>%
4	summarise(number_year = n()) %>%
5	arrange(desc(number_year))

مشخص است که برای مرتب‌سازی خروجی از arrange و شیوه مرتب‌سازی نزولی (Descending) استفاده شده است. خروجی که شامل تعداد بازی‌های بازیکنان به صورت نزولی است را در ادامه می‌توانید ببینید.

1## # A tibble: 10,395 x 2
2##     playerID number_year
3##       <fctr>       <int>
4##  1 pennohe01          11
5##  2 joosted01          10
6##  3 mcguide01          10
7##  4  rosepe01          10
8##  5 davisha01           9
9##  6 johnssi01           9
10##  7  kaatji01           9
11##  8 keelewi01           9
12##  9 marshmi01           9
13## 10 quirkja01           9
14## # ... with 10,385 more rows

اگر بخواهید تعداد مشاهدات منحصر به فرد را شمارش کنید باید از n_distinct بهره بگیرید. فرض کنید احتیاج به لیستی دارید که در آن مشخص شود هر تیم تا به حال از چند بازیکن استفاده کرده است. کدی که در ادامه می‌بینید به این منظور تهیه شده است.

1# distinct values
2data %>%
3  group_by(teamID) %>%
4  summarise(number_player = n_distinct(playerID)) %>%
5  arrange(desc(number_player))

خروجی به صورت زیر در خواهد آمد. همانطور که مشخص است number_player تعداد بازیکنان برای هر تیم را ثبت و نمایش داده است.

1## # A tibble: 148 x 2
2##    teamID number_player
3##    <fctr>         <int>
4##  1    CHN           751
5##  2    SLN           729
6##  3    PHI           699
7##  4    PIT           683
8##  5    CIN           679
9##  6    BOS           647
10##  7    CLE           646
11##  8    CHA           636
12##  9    DET           623
13## 10    NYA           612
14## # ... with 138 more rows

گروه‌بندی ترکیبی (Multiple Groups)

همانطور که گفته شد، تابع group_by امکان دسته‌بندی مشاهدات را براساس یک متغیر عامل انجام می‌دهد. این طبقه‌بندی می‌تواند به صورت ترکیبی نیز باشد. برای مثال می‌توان بازی‌ها را براساس هم سال و هم تیم، طبقه‌بندی کرده و میانگین بازی‌های صورت گرفته را محاسبه کرد.

در خروجی از ترتیب نزولی کد تیم (teamID) و کد سال (yearID) بهره گرفته‌ایم تا میانگین بازی‌های هر تیم در سال‌های مختلف را نمایش دهیم. به کد زیر توجه کنید:

1# Multiple groups
2data %>%
3  group_by(yearID, teamID) %>%
4  summarise(mean_games = mean(G)) %>%
5  arrange(desc(teamID, yearID))

خروجی در ادامه قابل مشاهده است. همانطور که می‌بینید، ترتیب نمایش متوسط بازی‌ها براساس اولویت نام تیم است. اگر نام تیمی تکراری باشد، متوسط بازی‌ها به ترتیب سال انجام بازی از کم به زیاد مرتب شده است.

1## # A tibble: 2,829 x 3
2## # Groups:   yearID [146]
3##    yearID teamID mean_games
4##     <int> <fctr>      <dbl>
5##  1   1884    WSU   20.41667
6##  2   1891    WS9   46.33333
7##  3   1886    WS8   22.00000
8##  4   1887    WS8   51.00000
9##  5   1888    WS8   27.00000
10##  6   1889    WS8   52.42857
11##  7   1884    WS7    8.00000
12##  8   1875    WS6   14.80000
13##  9   1873    WS5   16.62500
14## 10   1872    WS4    4.20000
15## # ... with 2,819 more rows

ایجاد فیلتر (Filter)

گاهی لازم است که محاسبات براساس مشاهدات خاصی صورت گیرد. به کمک تابع ()filter این امکان در R بوجود آمده است. فرض کنید می‌خواهید محاسبات میانگین بازی‌ها را به سال‌های بعد از ۱۹۸۰ محدود کنید. کد زیر به این منظور نوشته شده است.

1# Filter
2data %>%
3	filter(yearID > 1980) %>%
4	group_by(yearID) %>%
5	summarise(mean_game_year = mean(G))

مشخص است که در تابع ()filter از پارامتر 1980<yearID برای ایجاد محدودیت روی مشاهدات برحسب سال‌های بعد از 1980 استفاده شده، سپس طبقه‌بندی و محاسبه میانگین بازی‌ها به تفکیک سال، انجام شده است. نتیجه اجرای کد به صورت زیر خواهد بود.

1## # A tibble: 36 x 2
2##    yearID mean_game_year
3##     <int>          <dbl>
4##  1   1981       40.64583
5##  2   1982       56.97790
6##  3   1983       60.25128
7##  4   1984       62.97436
8##  5   1985       57.82828
9##  6   1986       58.55340
10##  7   1987       48.74752
11##  8   1988       52.57282
12##  9   1989       58.16425
13## 10   1990       52.91556
14## # ... with 26 more rows

خارج کردن از گروه‌بندی (Ungroup)

اگر در حین محاسبات روی گروه‌ها، لازم باشد که شاخصی برای همه مشاهدات بدست آید، می‌توانید از تابع ()ungroup استفاده کنید. فرض کنید قرار است درصد بازی‌ها خانگی (HR) به کل بازی‌ها (G)، به تفکیک هر بازیکن محاسبه شود. براساس این مقدارها، میانگین درصد کل بازی‌های خانگی بازیکنان (بدون در نظر گرفتن گروه‌بندی براساس بازیکنان) نیز باید در انتها بدست آید.

همانطور که در کد زیر قابل مشاهده است، تابع ()ungroup به عنوان یک تابع درون عملگرهای سلسله‌ مراتبی ظاهر شده و باعث می‌شود که گروه‌بندی برداشته شود. بنابراین محاسبه summarise برای همه مشاهدات اعمال خواهد شد.

1# Ungroup the data
2data %>%
3	filter(HR > 0) %>%
4	group_by(playerID) %>%
5	summarise(average_HR_game = sum(HR) / sum(G)) %>%
6	ungroup() %>%
7	summarise(total_average_homerun = mean(average_HR_game))

همانطور که دیده می‌شود، فیلتر $$filter(HR>0)$$ باعث می‌شود، مشاهداتی که تعداد بازی‌های خانگی‌ آن‌ها صفر است، از محاسبات خارج شوند. خروجی به صورت زیر در خواهد آمد.

1## # A tibble: 1 x 1
2##   total_average_homerun
3##                   <dbl>
4## 1            0.06882226

به این ترتیب مشخص است که فقط بطور متوسط ۶ درصد بازی‌های بازیکنان در خانه صورت گرفته است.

نکته: در حالت کلی برای گروه‌بندی یا خارج کردن مشاهدات از گروه‌بندی، باید از قالب‌های زیر استفاده کنید.

1group(df, X1, X2, X3)
2ungroup(df)

خلاصه

جدول زیر به بررسی اجمالی محاسبات توسط summarise پرداخته است.

روش تابعکد
محاسبه میانگین روی مجموعه داده df روی متغیر x1meansummarise(df,mean_x1=mean(x1))
محاسبه میانه روی مجموعه داده df روی متغیر x1mediansummarise(df,median_x1=median(x1))
محاسبه مجموع روی مجموعه داده df روی متغیر x1sumsummarise(df,sum_x1=sum(x1))
محاسبه انحراف استاندارد روی مجموعه داده df روی متغیر x1sdsummarise(df,sd_x1=sd(x1))
محاسبه دامنه چارکی روی مجموعه داده df روی متغیر x1IQRsummarise(df,interquartile_x1=IQR(x1))
محاسبه حداقل روی مجموعه داده df روی متغیر x1minsummarise(df,minimum_x1=min(x1))
محاسبه حداکثر روی مجموعه داده df روی متغیر x1maxsummarise(df,maximum_x1=max(x1))
محاسبه چندک‌ها روی مجموعه داده df روی متغیر x1quantilesummarise(df,quantile_x1=quantile(x1))
محاسبه اولین مقدار روی مجموعه داده df روی متغیر x1firstsummarise(df,first_x1=first(x1))
محاسبه آخرین مقدار روی مجموعه داده df روی متغیر x1lastsummarise(df,last_x1=last(x1))
محاسبه nامین مقدار روی مجموعه داده df روی متغیر x1nthsummarise(df,nth_x1=nth(x1, 2))
محاسبه تعداد مقدار روی مجموعه داده df روی متغیر x1nsummarise(df,n_x1=n(x1))
محاسبه تعداد تکرار‌های یک مقدار روی مجموعه داده df روی متغیر x1n_distinctsummarise(df,n_distinct _x1=n_distinct(x1))

اگر مطلب بالا برای شما مفید بوده، آموزش‌ها و مطالب زیر نیز که در زمینه به کار‌گیری آمار و محاسبات در نرم‌افزار R هستند، به شما پیشنهاد می‌شوند:

^^

بر اساس رای ۱ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *