بسم الله الرحمن الرحيم

Data frames

تاريخ النشر : Oct. 5, 2022

سيتم تخزين معظم مجموعات البيانات التي ستعمل معها كإطارات بيانات. بنهاية هذا الفصل ، ستكون قادرًا على إنشاء إطار بيانات ، وتحديد أجزاء مثيرة للاهتمام من إطار البيانات ، وترتيب إطار بيانات وفقًا لمتغيرات معينة.


What's a data frame?

سيتم تخزين معظم مجموعات البيانات التي ستعمل معها كإطارات بيانات. بنهاية هذا الفصل ، ستكون قادرًا على إنشاء إطار بيانات ، وتحديد أجزاء مثيرة للاهتمام من إطار البيانات ، وترتيب إطار بيانات وفقًا لمتغيرات معينة.

ما هو إطار البيانات؟

قد تتذكر من الفصل الخاص بالمصفوفات أن جميع العناصر التي تضعها في المصفوفة يجب أن تكون من نفس النوع. في ذلك الوقت ، كانت مجموعة البيانات الخاصة بك في Star Wars تحتوي فقط على عناصر رقمية.

ومع ذلك ، عند إجراء مسح لأبحاث السوق ، غالبًا ما يكون لديك أسئلة مثل:

'هل انت متزوج؟' أو أسئلة "نعم / لا" (logical)

'كم عمرك؟' (numeric)

"ما رأيك في هذا المنتج؟" أو غيرها من الأسئلة "المفتوحة" (character)

...

الناتج ،كل الإجابات على الأسئلة التي تمت صياغتها أعلاه ، هي عبارة مجموعة بيانات من أنواع بيانات مختلفة. ستجد نفسك غالبًا تعمل مع مجموعات البيانات التي تحتوي على أنواع بيانات مختلفة بدلاً من نوع واحد فقط.

يحتوي إطار البيانات على متغيرات مجموعة البيانات كأعمدة والملاحظات كصفوف. سيكون هذا مفهومًا مألوفًا لأولئك القادمين من حزم برامج إحصائية مختلفة مثل SAS أو SPSS.

# Print out built-in R data frame
mtcars
# Print out built-in R data frame
mtcars 
                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

سريعًا ، ألق نظرة على مجموعة البيانات الخاصة بك

العمل مع مجموعات البيانات الكبيرة من المألوف في تحليل البيانات. عندما تعمل مع مجموعات بيانات وإطارات بيانات كبيرة (للغاية) ، فإن مهمتك الأولى كمحلل بيانات هي تطوير فهم واضح لهيكلها وعناصرها الرئيسية. لذلك ، من المفيد غالبًا إظهار جزء صغير فقط من مجموعة البيانات بأكملها.

فكيف تفعل هذا في R؟ حسنًا ، يمكّنك head () من إظهار الملاحظات الأولى لإطار البيانات. وبالمثل ، يطبع tail () الملاحظات الأخيرة في مجموعة البيانات الخاصة بك.

يطبع كل من head () و tail () سطرًا علويًا يسمى "header" ، والذي يحتوي على أسماء المتغيرات المختلفة في مجموعة البيانات الخاصة بك.

# Call head() on mtcars
head(mtcars)

ألق نظرة على الهيكل

هناك طريقة أخرى تُستخدم غالبًا للحصول على نظرة عامة سريعة على بياناتك وهي الدالة str (). تظهر لك الدالة str () بنية مجموعة البيانات الخاصة بك. بالنسبة لإطار البيانات ، يخبرك بما يلي:

العدد الإجمالي للملاحظات (على سبيل المثال ، 32 نوعًا من السيارات)

العدد الإجمالي للمتغيرات (على سبيل المثال 11 ميزة سيارة)

قائمة كاملة بأسماء المتغيرات (مثل ميلا في الغالون ، والاسطوانة ...)

نوع البيانات لكل متغير (مثل num)

الملاحظات الأولى

غالبًا ما يكون تطبيق الدالة str () هو أول ما تفعله عند تلقي مجموعة بيانات أو إطار بيانات جديد. إنها طريقة رائعة للحصول على مزيد من الأفكار في مجموعة البيانات الخاصة بك قبل الغوص في التحليل الحقيقي.

# Investigate the structure of mtcars
str(mtcars)
# Investigate the structure of mtcars
str(mtcars)
'data.frame':	32 obs. of  11 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...
 $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

Creating a data frame

إنشاء إطار بيانات

إنشاء إطار بيانات , ارتدِ حقيبتك النفاثة لأن الوقت قد حان لاستكشاف الفضاء!

كهدف أول ، تريد إنشاء إطار بيانات يصف الخصائص الرئيسية لثمانية كواكب في نظامنا الشمسي. ،و هي:

  1. نوع الكوكب (أرضي أو غازي عملاق).
  2. قطر الكوكب بالنسبة لقطر الأرض.
  3. دوران الكوكب عبر الشمس بالنسبة للأرض.
  4. إذا كان الكوكب به حلقات أم لا (صواب أو خطأ).

بعد إجراء بعض الأبحاث عالية الجودة على ويكيبيديا ، تشعر بالثقة الكافية لإنشاء المتجهات الضرورية: الاسم والنوع والقطر والدوران والحلقات

يمكنك إنشاء إطار بيانات باستخدام وظيفة data.frame (). كوسيطات arguments ، تقوم بتمرير المتجهات من قبل: ستصبح الأعمدة المختلفة لإطار البيانات الخاص بك. نظرًا لأن كل عمود له نفس الطول ، يجب أن يكون للمتجهات التي تمررها نفس الطول أيضًا. لكن لا تنس أنه من الممكن (ومن المحتمل) أنها تحتوي على أنواع مختلفة من البيانات.

# Definition of vectors
name <- c("Mercury", "Venus", "Earth", 
          "Mars", "Jupiter", "Saturn", 
          "Uranus", "Neptune")
type <- c("Terrestrial planet", 
          "Terrestrial planet", 
          "Terrestrial planet", 
          "Terrestrial planet", "Gas giant", 
          "Gas giant", "Gas giant", "Gas giant")
diameter <- c(0.382, 0.949, 1, 0.532, 
              11.209, 9.449, 4.007, 3.883)
rotation <- c(58.64, -243.02, 1, 1.03, 
              0.41, 0.43, -0.72, 0.67)
rings <- c(FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE)

# Create a data frame from the vectors
planets_df <- data.frame(name, type, diameter, rotation , rings)

Creating a data frame (2)

إنشاء إطار بيانات (2)

يجب أن يحتوي إطار بيانات planets_df على 8 ملاحظات و 5 متغيرات.

# Check the structure of planets_df
str(planets_df)
'data.frame':	8 obs. of  5 variables:
 $ name    : chr  "Mercury" "Venus" "Earth" "Mars" ...
 $ type    : chr  "Terrestrial planet" "Terrestrial planet" "Terrestrial planet" "Terrestrial planet" ...
 $ diameter: num  0.382 0.949 1 0.532 11.209 ...
 $ rotation: num  58.64 -243.02 1 1.03 0.41 ...
 $ rings   : logi  FALSE FALSE FALSE FALSE TRUE TRUE ...
Selection of data frame elements [ ]

اختيار عناصر إطار البيانات

على غرار المتجهات والمصفوفات ، يمكنك تحديد عناصر من إطار بيانات بمساعدة الأقواس المربعة []. باستخدام الفاصلة ، يمكنك تحديد ما يجب تحديده من الصفوف والأعمدة على التوالي. فمثلا:

my_df [1،2] يحدد القيمة في الصف الأول والعمود الثاني في my_df.

my_df [1: 3،2: 4] يختار الصفوف 1 و 2 و 3 والأعمدة 2 و 3 و 4 في my_df.

في بعض الأحيان تريد تحديد جميع عناصر صف أو عمود. على سبيل المثال ، my_df [1،] يحدد كل عناصر الصف الأول. دعونا الآن نطبق هذه التقنية على planets_df!

# The planets_df data frame from the previous exercise is pre-loaded

# Print out diameter of Mercury (row 1, column 3)
planets_df[1,3]

# Print out data for Mars (entire fourth row)
planets_df[4,]

Selection of data frame elements (2)

اختيار عناصر إطار البيانات (2)

بدلاً من استخدام الأرقام لتحديد عناصر إطار البيانات ، يمكنك أيضًا استخدام أسماء المتغيرات لتحديد أعمدة إطار البيانات.

افترض أنك تريد تحديد العناصر الثلاثة الأولى لعمود type . طريقة واحدة للقيام بذلك هي

planets_df [1: 3،2]

من العيوب المحتملة لهذا الأسلوب أنه عليك معرفة (أو البحث عن) رقم العمود من type ، والذي يصبح صعبًا إذا كان لديك الكثير من المتغيرات. غالبًا ما يكون من الأسهل استخدام اسم المتغير:

planets_df [1: 3، "type "]

# The planets_df data frame from the previous exercise is pre-loaded

# Select first 5 values of diameter column
planets_df[1:5,"diameter"]
[1]  0.382  0.949  1.000  0.532 11.209
Use the $ sign

فقط الكواكب ذات الحلقات

سترغب غالبًا في تحديد عمود بأكمله ، أي متغير واحد محدد من إطار البيانات. إذا كنت ترغب في تحديد جميع عناصر متغير diameter ، على سبيل المثال ، فكل منهما سيفي بالغرض:

planets_df [، 3]

planets_df [، " diameter "]

ومع ذلك ، هناك طريق مختصر. إذا كانت الأعمدة تحتوي على أسماء ، فيمكنك استخدام علامة $:

planets_df$diameter

# planets_df is pre-loaded in your workspace

# Select the rings variable from planets_df
rings_vector <- planets_df$rings
  
# Print out rings_vector
rings_vector
[1] FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE

فقط الكواكب ذات الحلقات (2)

ربما تتذكر من المدرسة الثانوية أن بعض الكواكب في نظامنا الشمسي لها حلقات والبعض الآخر لا. للأسف لا يمكنك تذكر أسمائهم. هل يمكن أن يساعدك R؟

إذا قمت بكتابة Rings_vector في وحدة التحكم ، فستحصل على:

[1] FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE

هذا يعني أن الملاحظات الأربعة الأولى (أو الكواكب) ليس لها حلقة (FALSE ) ، لكن الأربعة الأخرى لها حلقة (TRUE). ومع ذلك ، لا يمكنك معرفة أسماء هذه الكواكب ، وقطرها ، وما إلى ذلك.

دعنا نحاول استخدام Rings_vector لتحديد البيانات الخاصة بالكواكب الأربعة ذات الحلقات.

# Adapt the code to select name column for planets with rings
planets_df[rings_vector, "name"]
[1] "Jupiter" "Saturn"  "Uranus"  "Neptune"
# Adapt the code to select all columns for planets with rings
planets_df[rings_vector,]
name      type diameter rotation rings
5 Jupiter Gas giant   11.209     0.41  TRUE
6  Saturn Gas giant    9.449     0.43  TRUE
7  Uranus Gas giant    4.007    -0.72  TRUE
8 Neptune Gas giant    3.883     0.67  TRUE
subset()

فقط الكواكب ذات الحلقات ولكن أقصر

إذن ما الذي تعلمته بالضبط في التدريبات السابقة؟ لقد حددت مجموعة فرعية من إطار البيانات (planets_df) بناءً على ما إذا كان شرط معين صحيحًا أم لا (حلقات أم لا حلقات) ، وتمكنت من سحب جميع البيانات ذات الصلة. جميل جدا! الآن ،

الآن ، دعنا ننتقل إلى مستوى أعلي ونستخدم الدالة subset (). فهي تعمل كاختصار تمامًا نفس ما فعلته في التمارين السابقة.

subset(my_df, subset = some_condition)

تحدد argument الأولى subset() مجموعة البيانات التي تريد subset لها. بإضافة argument الثانية ، فإنك تعطي R المعلومات والشروط اللازمة لتحديد المجموعة الفرعية الصحيحة.

سيعطي الكود أدناه نفس النتيجة بالضبط التي حصلت عليها في التمرين السابق ، لكن هذه المرة ، لم تكن بحاجة إلى متجه rings!

subset(planets_df, subset = rings)

# planets_df is pre-loaded in your workspace

# Select planets with diameter < 1
subset(planets_df,subset= diameter < 1)
name               type diameter rotation rings
1 Mercury Terrestrial planet    0.382    58.64 FALSE
2   Venus Terrestrial planet    0.949  -243.02 FALSE
4    Mars Terrestrial planet    0.532     1.03 FALSE
order()

الترتيب

صنع التصنيفات هو أحد الشؤون المفضلة للبشرية. يمكن أن تكون هذه التصنيفات مفيدة (أفضل الجامعات في العالم) ، أو مسلية (أكثر نجوم السينما تأثيرًا) أو لا طائل من ورائها (أفضل 007 شبيهة).

في تحليل البيانات ، يمكنك ترتيب بياناتك وفقًا لمتغير معين في مجموعة البيانات. في R ، يتم ذلك بمساعدة ترتيبorder() .

order () هي وظيفة تمنحك الموضع المرتب لكل عنصر عند تطبيقه على متغير ، مثل المتجه على سبيل المثال:

a <- c(100, 10, 1000)
order(a)
[1] 2 1 3

10 ، وهو العنصر الثاني في a ، هو أصغر عنصر ، لذا 2 يأتي أولاً في إخراج الترتيبorder(a)

. 100 ، وهو العنصر الأول في a هو ثاني أصغر عنصر ، لذلك 1 يأتي في المرتبة الثانية في إخراج الترتيب (أ).

هذا يعني أنه يمكننا استخدام الدلالة order(a) لإعادة ترتيبa:

a[order(a)]
[1] 10 100 1000

# Play around with the order function in the console
a <- c(100, 10, 1000)
order(a)

ترتيب إطار البيانات الخاصة بك

حسنًا ، الآن بعد أن فهمت دالة order () ، دعنا نفعل شيئًا مفيدًا بها. قد ترغب في إعادة ترتيب إطار البيانات الخاص بك بحيث يبدأ بأصغر كوكب وينتهي بأكبر كوكب. ترتيب على عمود diameter .

# planets_df is pre-loaded in your workspace

# Use order() to create positions
positions <-  order(planets_df$diameter)

# Use positions to sort planets_df
planets_df[positions,]
name               type diameter rotation rings
1 Mercury Terrestrial planet    0.382    58.64 FALSE
4    Mars Terrestrial planet    0.532     1.03 FALSE
2   Venus Terrestrial planet    0.949  -243.02 FALSE
3   Earth Terrestrial planet    1.000     1.00 FALSE
8 Neptune          Gas giant    3.883     0.67  TRUE
7  Uranus          Gas giant    4.007    -0.72  TRUE
6  Saturn          Gas giant    9.449     0.43  TRUE
5 Jupiter          Gas giant   11.209     0.41  TRUE

العودة إلي Introduction to R (تلخيصات من DATA CAMP)