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
إنشاء إطار بيانات
إنشاء إطار بيانات , ارتدِ حقيبتك النفاثة لأن الوقت قد حان لاستكشاف الفضاء!
كهدف أول ، تريد إنشاء إطار بيانات يصف الخصائص الرئيسية لثمانية كواكب في نظامنا الشمسي. ،و هي:
بعد إجراء بعض الأبحاث عالية الجودة على ويكيبيديا ، تشعر بالثقة الكافية لإنشاء المتجهات الضرورية: الاسم والنوع والقطر والدوران والحلقات
يمكنك إنشاء إطار بيانات باستخدام وظيفة 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 ...
اختيار عناصر إطار البيانات
على غرار المتجهات والمصفوفات ، يمكنك تحديد عناصر من إطار بيانات بمساعدة الأقواس المربعة []. باستخدام الفاصلة ، يمكنك تحديد ما يجب تحديده من الصفوف والأعمدة على التوالي. فمثلا:
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
فقط الكواكب ذات الحلقات
سترغب غالبًا في تحديد عمود بأكمله ، أي متغير واحد محدد من إطار البيانات. إذا كنت ترغب في تحديد جميع عناصر متغير 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
فقط الكواكب ذات الحلقات ولكن أقصر
إذن ما الذي تعلمته بالضبط في التدريبات السابقة؟ لقد حددت مجموعة فرعية من إطار البيانات (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
الترتيب
صنع التصنيفات هو أحد الشؤون المفضلة للبشرية. يمكن أن تكون هذه التصنيفات مفيدة (أفضل الجامعات في العالم) ، أو مسلية (أكثر نجوم السينما تأثيرًا) أو لا طائل من ورائها (أفضل 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)