دالة التجميع R: مثال على تلخيص وGroup_by()

ملخص المتغير مهم للحصول على فكرة عن البيانات. على الرغم من أن تلخيص متغير حسب المجموعة يعطي معلومات أفضل حول توزيع البيانات.

في هذا البرنامج التعليمي، ستتعلم كيفية تلخيص مجموعة بيانات حسب المجموعة باستخدام مكتبة dplyr.

في هذا البرنامج التعليمي، سوف تستخدم مجموعة بيانات الضرب. تحتوي مجموعة البيانات الأصلية على 102816 ملاحظة و22 متغيرًا. ستستخدم 20 بالمائة فقط من مجموعة البيانات هذه وستستخدم المتابعةwing المتغيرات:

  • معرف اللاعب: رمز معرف اللاعب. عامل
  • معرف السنة: السنة. عامل
  • معرف الفريق: الفريق. عامل
  • معرف إل جي: الدوري. العامل: AA AL FL NL PL UA
  • أ.ب: عند الخفافيش. رقمي
  • G: الألعاب: عدد المباريات التي لعبها اللاعب. رقمي
  • ر: يركض. رقمي
  • الموارد البشرية: homeruns. رقمي
  • ش: ضربات التضحية. رقمي

قبل إجراء الملخص، سوف تقوم بالمتابعةwing خطوات تحضير البيانات:

  • الخطوة 1: استيراد البيانات
  • الخطوة 2: حدد المتغيرات ذات الصلة
  • الخطوة 3: فرز البيانات
library(dplyr)

# Step 1
data <- read.csv("https://raw.githubusercontent.com/guru99-edu/R-Programming/master/lahman-batting.csv") % > %

# Step 2
select(c(playerID, yearID, AB, teamID, lgID, G, R, HR, SH))  % > % 

# Step 3
arrange(playerID, teamID, yearID)

من الممارسات الجيدة عند استيراد مجموعة بيانات استخدام الدالة glimpse() للحصول على فكرة حول بنية مجموعة البيانات.

# Structure of the data
glimpse(data)

الإخراج:

Observations: 104,324
Variables: 9
$ playerID <fctr> aardsda01, aardsda01, aardsda01, aardsda01, aardsda01, a...
$ yearID   <int> 2015, 2008, 2007, 2006, 2012, 2013, 2009, 2010, 2004, 196...
$ AB       <int> 1, 1, 0, 2, 0, 0, 0, 0, 0, 603, 600, 606, 547, 516, 495, ...
$ teamID   <fctr> ATL, BOS, CHA, CHN, NYA, NYN, SEA, SEA, SFN, ATL, ATL, A...
$ lgID     <fctr> NL, AL, AL, NL, AL, NL, AL, AL, NL, NL, NL, NL, NL, NL, ...
$ G        <int> 33, 47, 25, 45, 1, 43, 73, 53, 11, 158, 155, 160, 147, 15...
$ R        <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 113, 84, 100, 103, 95, 75...
$ HR       <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 39, 29, 44, 38, 47, 34, 40...
$ SH       <int> 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 6, ...

لخص()

بناء جملة summarise() أساسي ومتسق مع الأفعال الأخرى المضمنة في مكتبة dplyr.

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

انظر إلى الكود أدناه:

summarise(data, mean_run =mean(R))

شرح الكود

  • summarise(data, mean_run = mean(R)): ينشئ متغيرًا باسم mean_run وهو متوسط ​​العمود الذي يتم تشغيله من بيانات مجموعة البيانات.

الإخراج:

##   mean_run
## 1 19.20114

يمكنك إضافة العديد من المتغيرات كما تريد. يمكنك إرجاع متوسط ​​الألعاب التي تم لعبها ومتوسط ​​عدد التضحيات.

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

شرح الكود

  • mean_SH = mean(SH, na.rm = TRUE): تلخيص المتغير الثاني. قمت بتعيين na.rm = TRUE لأن العمود SH يحتوي على ملاحظات مفقودة.

الإخراج:

##   mean_games  mean_SH
## 1   51.98361 2.340085

Group_by مقابل عدم وجود group_by

الدالة Summerise() بدون group_by() لا معنى لها. يقوم بإنشاء إحصائية موجزة حسب المجموعة. المكتبة com.dplyr يطبق وظيفة تلقائيًا على المجموعة التي مررتها داخل الفعل group_by.

لاحظ أن group_by يعمل بشكل مثالي مع جميع الأفعال الأخرى (على سبيل المثال، mutate()، filter()، الترتيب()، ...).

من الملائم استخدام مشغل خط الأنابيب عندما يكون لديك أكثر من خطوة واحدة. يمكنك حساب متوسط ​​homerun بواسطة دوري البيسبول.

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

شرح الكود

  • البيانات: مجموعة البيانات المستخدمة لإنشاء الإحصائيات الموجزة
  • group_by(lgID): حساب الملخص عن طريق تجميع المتغير `lgID
  • summarise(mean_run = mean(HR)): حساب متوسط ​​التشغيل المنزلي

الإخراج:

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

يعمل مشغل الأنابيب مع ggplot() أيضًا. يمكنك بسهولة إظهار إحصائية الملخص باستخدام رسم بياني. يتم دفع جميع الخطوات داخل خط الأنابيب حتى يتم رسم العنب. يبدو أكثر وضوحًا رؤية متوسط ​​​​الركض حسب الدوري باستخدام شريط شريط. يوضح الكود أدناه قوة الجمع بين group_by() و summarise() و ggplot() معًا.

سوف تفعل ما يليwing خطوة:

  • الخطوة 1: حدد إطار البيانات
  • الخطوة 2: بيانات المجموعة
  • الخطوة 3: تلخيص البيانات
  • الخطوة 4: رسم إحصائيات الملخص
library(ggplot2)
# Step 1
data % > % 
#Step 2
group_by(lgID) % > % 
#Step 3
summarise(mean_home_run = mean(HR)) % > % 
#Step 4
ggplot(aes(x = lgID, y = mean_home_run, fill = lgID)) +
    geom_bar(stat = "identity") +
    theme_classic() +
    labs(
        x = "baseball league",
        y = "Average home run",
        title = paste(
            "Example group_by() with summarise()"
        )
    )

الإخراج:

مثال Group_by مع تلخيص

الوظيفة باختصار ()

الفعل summarise() متوافق مع جميع الوظائف في R تقريبًا. فيما يلي قائمة قصيرة من الوظائف المفيدة التي يمكنك استخدامها مع summarise():

هدف المسمى الوظيفي الوصف
الباقة الاولى تعني() متوسط ​​المتجه x
الوسيط() متوسط ​​المتجه x
المبلغ () مجموع المتجهات x
اختلاف SD () الانحراف المعياري للمتجه x
معدل الذكاء () الربعي للمتجه x
الفترة (من ... إلى) دقيقة () الحد الأدنى من المتجه x
ماكس () الحد الأقصى للناقل x
كمية () كمية المتجه x
الموقع الحالي أولاً() استخدم مع group_by() الملاحظة الأولى للمجموعة
آخر() استخدم مع group_by(). الملاحظة الأخيرة للمجموعة
نث () استخدم مع group_by(). الملاحظة التاسعة للمجموعة
العد التنازلي ن() استخدم مع group_by(). حساب عدد الصفوف
n_distinct() استخدم مع group_by(). حساب عدد الملاحظات المتميزة

سنرى أمثلة لكل وظائف الجدول 1.

الوظيفة الأساسية

في المثال السابق، لم تقم بتخزين إحصائيات الملخص في إطار البيانات.

يمكنك المتابعة في خطوتين لإنشاء إطار تاريخ من الملخص:

  • الخطوة 1: قم بتخزين إطار البيانات لمزيد من الاستخدام
  • الخطوة 2: استخدم مجموعة البيانات لإنشاء مخطط خطي

الخطوة 1) يمكنك حساب متوسط ​​عدد المباريات التي تم لعبها حسب السنة.

## Mean
ex1 <- data % > %
	group_by(yearID) % > %
	summarise(mean_game_year = mean(G))
head(ex1)

شرح الكود

  • يتم تخزين الإحصائيات الموجزة لمجموعة بيانات الضرب في إطار البيانات ex1.

الإخراج:

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

الخطوة 2) يمكنك إظهار إحصائيات الملخص باستخدام مخطط خطي ورؤية الاتجاه.

# Plot the graph
ggplot(ex1, aes(x = yearID, y = mean_game_year)) +
    geom_line() +
    theme_classic() +
    labs(
        x = "Year",
        y = "Average games played",
        title = paste(
            "Average games played from 1871 to 2016"
        )
    )

الإخراج:

مثال الوظيفة الأساسية

التقليل

تلخيص الوظيفة () متوافق مع الإعداد الفرعي.

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

شرح الكود

  • median_at_bat_league_no_zero = median(AB[AB > 0]): يحتوي المتغير AB على الكثير من 0. يمكنك مقارنة متوسط في الخفافيش متغير مع وبدون 0.

الإخراج:

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

مجموع

وظيفة أخرى مفيدة لتجميع المتغير هي sum ().

يمكنك التحقق من الدوريات التي لديها عدد أكبر من اللاعبين.

## Sum
data % > %
	group_by(lgID) % > %
	summarise(sum_homerun_league = sum(HR))

الإخراج:

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

الانحراف المعياري

يتم حساب الانتشار في البيانات باستخدام الانحراف المعياري أو sd() في R.

# Spread
data % > %
	group_by(teamID) % > %
	summarise(sd_at_bat_league = sd(HR))

الإخراج:

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

هناك الكثير من عدم المساواة في كمية السباق الذي يقوم به كل فريق.

الحد الأدنى والحد الأقصى

يمكنك الوصول إلى الحد الأدنى والحد الأقصى للمتجه باستخدام الدالة min() وmax().

يعرض الكود أدناه أقل وأعلى عدد من المباريات في الموسم الذي لعبه اللاعب.

# Min and max
data % > %
	group_by(playerID) % > %
	summarise(min_G = min(G),
    max_G = max(G))

الإخراج:

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

العد التنازلي

يعد عد الملاحظات حسب المجموعة فكرة جيدة دائمًا. باستخدام R، يمكنك تجميع عدد التكرارات باستخدام n().

على سبيل المثال، يحسب الكود أدناه عدد السنوات التي لعبها كل لاعب.

# count observations
data % > %
	group_by(playerID) % > %
	summarise(number_year = n()) % > %
	arrange(desc(number_year))

الإخراج:

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

أولا و أخيرا

يمكنك تحديد الموضع الأول أو الأخير أو التاسع للمجموعة.

على سبيل المثال، يمكنك العثور على السنة الأولى والأخيرة لكل لاعب.

# first and last
data % > %
	group_by(playerID) % > %
	summarise(first_appearance = first(yearID),
		last_appearance = last(yearID))

الإخراج:

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

الملاحظة ن

الدالة nth() مكملة للوظيفة first() و last() . يمكنك الوصول إلى الملاحظة n ضمن مجموعة مع الفهرس المراد إرجاعه.

على سبيل المثال، يمكنك تصفية السنة الثانية فقط التي لعبها الفريق.

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

الإخراج:

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

عدد مميز من الملاحظة

تقوم الدالة n() بإرجاع عدد الملاحظات في المجموعة الحالية. الدالة المغلقة لـ n() هي n_distinct()، والتي تحسب عدد القيم الفريدة.

في المثال التالي، تقوم بجمع إجمالي اللاعبين الذين قام الفريق بتجنيدهم خلال جميع الفترات.

# distinct values
data % > %
	group_by(teamID) % > %
	summarise(number_player = n_distinct(playerID)) % > %
	arrange(desc(number_player))

شرح الكود

  • group_by(teamID): المجموعة حسب السنة و فريق
  • تلخيص(number_player = n_distinct(معرف اللاعب)): حساب العدد المميز للاعبين حسب الفريق
  • ترتيب(desc(number_player)): فرز البيانات حسب عدد اللاعب

الإخراج:

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

مجموعات متعددة

يمكن تحقيق إحصائية موجزة بين مجموعات متعددة.

# Multiple groups
data % > %
	group_by(yearID, teamID) % > %
	summarise(mean_games = mean(G)) % > %
	arrange(desc(teamID, yearID))

شرح الكود

  • group_by(yearID, teamID): المجموعة حسب السنة و فريق
  • summarise(mean_games = mean(G)): تلخيص عدد لاعبي اللعبة
  • ترتيب (desc(teamID, yearID)): فرز البيانات حسب الفريق والسنة

الإخراج:

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

منقي

قبل أن تنوي القيام بعملية ما، يمكنك تصفية مجموعة البيانات. تبدأ مجموعة البيانات في عام 1871، ولا يحتاج التحليل إلى السنوات التي سبقت عام 1980.

# Filter
data % > %
	filter(yearID > 1980) % > %
	group_by(yearID) % > %
	summarise(mean_game_year = mean(G))

شرح الكود

  • عامل التصفية (yearID > 1980): تصفية البيانات لإظهار السنوات ذات الصلة فقط (أي بعد عام 1980)
  • group_by(yearID): المجموعة حسب السنة
  • summarise(mean_game_year = mean(G)): تلخيص البيانات

الإخراج:

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

فك التجميع

وأخيرًا وليس آخرًا، تحتاج إلى إزالة التجميع قبل أن ترغب في تغيير مستوى الحساب.

# Ungroup the data
data % > %
	filter(HR > 0) % > %
	group_by(playerID) % > %
	summarise(average_HR_game = sum(HR) / sum(G)) % > %
	ungroup() % > %
	summarise(total_average_homerun = mean(average_HR_game))

شرح الكود

  • filter(HR >0) : استبعاد الصفر homerun
  • group_by(playerID): المجموعة حسب اللاعب
  • summarise(average_HR_game = sum(HR)/sum(G)): حساب متوسط ​​تشغيل اللاعب بواسطة اللاعب
  • فك التجميع (): إزالة التجميع
  • تلخيص(total_average_homerun = mean(average_HR_game)): تلخيص البيانات

الإخراج:

## # A tibble: 1 x 1
##   total_average_homerun
##                   <dbl>
## 1            0.06882226	

نبذة عامة

عندما تريد إرجاع ملخص حسب المجموعة، يمكنك استخدام:

# group by X1, X2, X3
group(df, X1, X2, X3)

تحتاج إلى فك تجميع البيانات باستخدام:

ungroup(df)

يلخص الجدول أدناه الوظيفة التي تعلمتها باستخدام summarise()

خدمة التوصيل المسمى الوظيفي رمز
تعني تعني
summarise(df,mean_x1 = mean(x1))
متوسط متوسط
summarise(df,median_x1 = median(x1))
مجموع مجموع
summarise(df,sum_x1 = sum(x1))
الانحراف المعياري sd
summarise(df,sd_x1 = sd(x1))
بين ربعي معدل الذكاء
summarise(df,interquartile_x1 = IQR(x1))
الحد الأدنى دقيقة
summarise(df,minimum_x1 = min(x1))
أقصى ماكس
summarise(df,maximum_x1 = max(x1))
كمية كمية
summarise(df,quantile_x1 = quantile(x1))
الملاحظة الأولى أول
summarise(df,first_x1 = first(x1))
الملاحظة الأخيرة آخر
summarise(df,last_x1 = last(x1))
الملاحظة ن نطة
summarise(df,nth_x1 = nth(x1, 2))
عدد الحدوث n
summarise(df,n_x1 = n(x1))
عدد من حدوث متميزة n_distinct
summarise(df,n_distinct _x1 = n_distinct(x1))