أنواع البيانات في R مع مثال
⚡ ملخص ذكي
تُحدد أنواع البيانات في لغة R كيفية تخزين القيم في الذاكرة، وتُحدد المعاملات ما يمكن للغة R فعله بها. يُغطى هنا كل من المتجهات والمتغيرات والمعاملات الحسابية والعلائقية والمنطقية ومعاملات الإسناد، مع أمثلة قابلة للتنفيذ.
ما هي أنواع البيانات في R؟
فيما يلي أنواع البيانات أو هياكل البيانات في برمجة R:
- الندوب
- المتجهات (عددية، حرفية، منطقية)
- المصفوفات
- إطارات البيانات
- قوائم
تجمع هذه القائمة بين فكرتين مترابطتين، وفصلهما يجعل بقية هذه الصفحة أسهل في المتابعة. نوع البيانات يصف ماهية القيمة الواحدة - رقم، أو نص، أو صحيح أو خطأ. هيكل البيانات يصف هذا كيفية تجميع القيم معًا وشكلها. القيم العددية والمتجهات والمصفوفات وإطارات البيانات والقوائم هي هياكل؛ أما القيم الموجودة بداخلها فلا تزال تنتمي إلى أحد الأنواع الأساسية في لغة R.
| الهيكلية | الأبعاد | هل يُسمح بالأنواع المختلطة؟ | الاستخدام النموذجي |
|---|---|---|---|
| العددية | متجه طوله 1 | لا | قياس واحد أو علامة |
| ناقلات | 1 | لا | عمود من القراءات من نوع واحد |
| مصفوفة | 2 | لا | الشبكات العددية والجبر الخطي |
| إطار البيانات | 2 | نعم، نوع واحد لكل عمود | مجموعات البيانات الجدولية |
| قائمة | 1، ولكن قابلة للتداخل | نعم، أي شيء لكل عنصر | نتائج النموذج والحاويات المختلطة |
لا يوجد نوع قياسي منفصل في لغة R: فالقيمة القياسية هي ببساطة متجه طوله واحد، وهذا هو السبب في أن الكثير من أكواد R مكتوبة للمتجهات الكاملة دفعة واحدة.
أنواع البيانات الأساسية في لغة R
كل قيمة في R تنتمي إلى واحدة من مجموعة صغيرة من الأنواع الأساسية (الذرية):
- 4.5 هي قيمة عشرية تسمى الأرقام.
- يبدو العدد 4 كعدد صحيح، لكن برنامج R يخزنه كعدد عشري مزدوج. اكتب 4L عندما يكون المطلوب عددًا صحيحًا.
- TRUE أو FALSE هي قيمة منطقية، وتسمى قيمة منطقية في لغة R.
- القيمة الموجودة داخل " " أو ' ' هي نص (سلسلة نصية). وتسمى هذه القيم أحرفًا.
يُكمل نوعان آخران المجموعة. القيم المركبة، مثل 3+2i، تحتوي على جزء حقيقي وجزء تخيلي، بينما تحتوي القيم الخام على بايتات. نادرًا ما يظهر كلا النوعين في التحليلات اليومية، ولكنهما مُدرجان في لغة R الأساسية. توثيق typeof() إلى جانب الأنواع الأربعة الشائعة.
| النوع | قيمة المثال | تُرجع الدالة class() | تُرجع الدالة typeof() |
|---|---|---|---|
| منطقي | الحقيقة | منطقي | منطقي |
| عدد صحيح | 4L | عدد صحيح | عدد صحيح |
| Double (رقمي) | 4.5 | الرقمية | مضاعفة |
| حرف | "R رائع" | حرف | حرف |
| مجمع | 3 + 2 ط | مجمع | مجمع |
| الخام | as.raw(10) | الخام | الخام |
يمكننا التحقق من نوع المتغير باستخدام دالة الفئة.
مثال 1: التحقق من متغير رقمي
# Declare variables of different types # Numeric x <- 28 class(x)
الإخراج:
## [1] "numeric"
مثال 2: التحقق من متغير حرفي
# String y <- "R is Fantastic" class(y)
الإخراج:
## [1] "character"
مثال 3: التحقق من متغير منطقي
# Boolean z <- TRUE class(z)
الإخراج:
## [1] "logical"
لاحظ أن الدالة class() تُرجع القيمة "numeric" للعدد 28 على الرغم من أنه لا يحتوي على جزء عشري. خزّنته لغة R كعدد مزدوج، ولا تكشف عن ذلك إلا الدالة typeof(). الفرق التالي الذي يستحق التعلم هو كيفية تسمية هذه القيم.
المتغيرات في لغة R
تُعدّ المتغيرات من اللبنات الأساسية في لغة R لتخزين القيم، وهي ذات أهمية بالغة لكل من يعمل في مجال علم البيانات. يمكن للمتغير في R تخزين رقم، أو كائن، أو نتيجة إحصائية، أو متجه، أو مجموعة بيانات، أو تنبؤ نموذج - أي شيء يُخرجه R. ويمكننا استخدام هذا المتغير لاحقًا ببساطة عن طريق استدعاء اسمه.
لتعريف متغير في لغة R، نحتاج إلى تعيين اسم له. يجب ألا يحتوي الاسم على مسافة. يمكننا استخدام الشرطة السفلية (_) لربط كلمتين.
يمكن أن تحتوي الأسماء على حروف وأرقام ونقاط وشرطات سفلية، ولكن يجب أن تبدأ بحرف أو نقطة، ولا يمكن استخدام الكلمات المحجوزة مثل TRUE وFALSE وNULL كأسماء. لإضافة قيمة إلى المتغير، استخدم <- أو =.
هنا بناء الجملة:
# First way to declare a variable: use the `<-` name_of_variable <- value # Second way to declare a variable: use the `=` name_of_variable = value
في سطر الأوامر، يمكننا كتابة التعليمات البرمجية التالية لمعرفة ما يحدث:
مثال 1: تعيين قيمة وطباعتها
# Print variable x
x <- 42
x
الإخراج:
## [1] 42
مثال 2: تعريف متغير ثانٍ
y <- 10 y
الإخراج:
## [1] 10
مثال 3: استخدام متغيرين في تعبير واحد
# We call x and y and apply a subtraction
x-y
الإخراج:
## [1] 32
المتغير الذي يحمل عدة قيم من نفس النوع هو متجه، وهو البنية التي تتوقعها جميع دوال R تقريبًا.
المتجهات في لغة R
المتجه هو مجموعة أحادية البعد، حيث تشترك جميع عناصرها في نفس النوع. يمكننا إنشاء متجه باستخدام جميع أنواع البيانات الأساسية في لغة R التي تعلمناها سابقًا. أبسط طريقة لإنشاء متجه في R هي استخدام الدالة c().
مثال 1: إنشاء متجه رقمي
# Numerical
vec_num <- c(1, 10, 49)
vec_num
الإخراج:
## [1] 1 10 49
مثال 2: إنشاء متجه أحرف
# Character vec_chr <- c("a", "b", "c") vec_chr
الإخراج:
## [1] "a" "b" "c"
مثال 3: إنشاء متجه منطقي
# Boolean vec_bool <- c(TRUE, FALSE, TRUE) vec_bool
الإخراج:
##[1] TRUE FALSE TRUE
إذا استقبلت الدالة c() أنواعًا مختلفة، فإنها لا تفشل. بل تُحوّل كل عنصر تلقائيًا إلى النوع الأكثر عموميةً، بحيث يصبح c(1, "a", TRUE) متجهًا نصيًا. كما يُمكننا إجراء عمليات حسابية على المتجهات في لغة R.
مثال 4: جمع متجهين عنصرًا بعنصر
# Create the vectors vect_1 <- c(1, 3, 5) vect_2 <- c(2, 4, 6) # Take the sum of A_vector and B_vector sum_vect <- vect_1 + vect_2 # Print out total_vector sum_vect
الإخراج:
[1] 3 7 11
تمت عملية الجمع عنصرًا بعنصر لأن كلا المتجهين لهما نفس الطول. عندما يختلف الطولان، يعيد برنامج R استخدام المتجه الأقصر، ويكرره حتى يتطابق مع المتجه الأطول، ولا يصدر تحذيرًا إلا إذا كان طول المتجه الأطول ليس من مضاعفات طول المتجه الأقصر.
مثال 5: تقسيم العناصر الخمسة الأولى
في لغة R، من الممكن تقسيم المتجه. في بعض الأحيان، نهتم فقط بالعناصر الخمسة الأولى من المتجه. يمكننا استخدام الأمر [1:5] لاستخراجها.tracالقيم من 1 إلى 5.
# Slice the first five rows of the vector
slice_vector <- c(1,2,3,4,5,6,7,8,9,10)
slice_vector[1:5]
الإخراج:
## [1] 1 2 3 4 5
مثال 6: إنشاء نطاق باستخدام النقطتين الرأسيتين Operaتور
أقصر طريقة لإنشاء نطاق من القيم هي استخدام رمز النقطتين (:) بين رقمين. على سبيل المثال، من المثال السابق، يمكننا كتابة c(1:10) لإنشاء متجه من القيم من واحد إلى عشرة.
# Faster way to create adjacent values
c(1:10)
الإخراج:
## [1] 1 2 3 4 5 6 7 8 9 10
لأن المتجه يغير نوعه بصمت عند مزجه، فمن المفيد معرفة كيفية فحص الأنواع وتحويلها عند الطلب.
كيفية التحقق من أنواع البيانات وتحويلها في لغة R
ثلاث عائلات من الدوال تجيب على الأسئلة الثلاثة التي تظهر باستمرار: ما هذا، وهل هذا نوع معين، وهل يمكن أن يصبح هذا نوعًا آخر.
| عائلة الوظائف | السؤال يجيب عليه | أمثلة |
|---|---|---|
| class()، typeof()، mode() | ما نوع هذه القيمة؟ | class(28), typeof(28), mode(28) |
| يكون.*() | هل هذه القيمة من النوع X؟ | is.numeric(), is.character(), is.logical() |
| مثل.*() | هل يمكن أن تصبح هذه القيمة من النوع X؟ | as.numeric()، as.character()، as.integer() |
| شارع () | كيف يبدو هذا الشيء بشكل عام؟ | str(vec_num) |
# Three different views of the same value x <- 28 class(x) # "numeric" -- the class used for method dispatch typeof(x) # "double" -- how R stores the value internally mode(x) # "numeric" -- the older S-style mode # Ask a yes/no question about a type is.numeric(x) # TRUE is.character(x) # FALSE # Convert between types as.character(x) # "28" as.integer("28") # 28 stored as an integer as.numeric("abc") # NA, with a coercion warning
هناك قاعدتان تفسران معظم المفاجآت هنا. أولاً، تُشير الدالة `class()` إلى الصنف المُستخدم لاستدعاء الدالة، بينما تُشير الدالة `typeof()` إلى نوع البيانات المُخزّن داخليًا، ولهذا السبب يُعتبر العدد 28 "عدديًا" في إحداهما و"مزدوجًا" في الأخرى. ثانيًا، لا يؤدي فشل عملية التحويل إلى إيقاف البرنامج النصي: تُعيد الدالة `as.numeric("abc")` القيمة NA وتُظهر تحذيرًا بشأن التحويل، لذا فإن القيم NA الصامتة بعد استيراد البيانات تُشير دائمًا تقريبًا إلى مشكلة في نوع البيانات. وينطبق المنطق نفسه على هذه الحالة. العوامل، والتي تخزن الفئات كرموز عددية صحيحة بالإضافة إلى جدول للمستويات.
بعد تحديد الأنواع، تأتي الخطوة التالية وهي تحديد العوامل التي تعمل عليها.
ر الحسابية Operaالاختصاصات
سنستعرض أولاً عوامل التشغيل الحسابية الأساسية في لغة البرمجة R. فيما يلي عوامل التشغيل الحسابية في لغة البرمجة R وما تمثله:
| المُشغل | الوصف |
|---|---|
| + | إضافة |
| - | فرعيةtracالإنتاج |
| * | تضاعف |
| / | تقسيم |
| ^ أو ** | الأسي |
| %% | باقي القسمة (modulo) |
| %/% | القسمة الصحيحة (الناتج، يتم تجاهل الباقي) |
كل عامل من هذه العوامل يتم تحويله إلى متجه، لذا فإن نفس التعبير يعمل على قيمة واحدة أو على عمود كامل.
مثال 1: الجمع
# An addition
3 + 4
الإخراج:
## [1] 7
يمكنك بسهولة نسخ ولصق كود R المذكور أعلاه في RStudio وحدة التحكم. في هذه المقالة، يتم عرض المخرجات على الأسطر التي تبدأ بـ ##. على سبيل المثال، إذا كتبنا الكود print("Guru99") تطبع وحدة التحكم [1] "Guru99"، والتي ستظهر في هذه الصفحة على النحو التالي: ## [1] "Guru99 ".
يشير الرمز ## إلى سطر من المخرجات المطبوعة، والرقم الموجود بين قوسين مربعين ([1]) هو فهرس القيمة الأولى في ذلك السطر، وليس جزءًا من النتيجة.
الجمل التي تبدأ بعلامة # هي تعليقات. يمكننا استخدام # داخل سكربت R لإضافة أي ملاحظة نريدها، ويتجاهلها R أثناء التشغيل.
مثال 2: الضرب
# A multiplication
3*5
الإخراج:
## [1] 15
مثال 3: القسمة
# A division
(5+5)/2
الإخراج:
## [1] 5
المثال 4: الأسس
# Exponentiation
2^5
الإخراج:
## [1] 32
مثال 5: باقي القسمة
# Modulo
28%%6
الإخراج:
## [1] 4
تُنتج العمليات الحسابية أرقامًا. أما المجموعة التالية من العمليات فتُنتج قيمتي "صواب" و"خطأ" بدلًا من ذلك.
R العلاقات (المقارنة) Operaالاختصاصات
تقارن عوامل المقارنة قيمتين وتعيد نتيجة منطقية. وهي العوامل التي تُنشئ الشروط المستخدمة في التصفية، ويتم تحويلها إلى متجهات بنفس طريقة عوامل الحساب.
| المُشغل | الوصف |
|---|---|
| > | اعظم من |
| < | Less من |
| >= | أكبر من أو يساوي |
| <= | Less من أو يساوي |
| == | يساوي تمامًا |
| != | لا يساوي |
a <- 10 b <- 3 a > b # TRUE a < b # FALSE a >= 10 # TRUE a <= 3 # FALSE a == b # FALSE a != b # TRUE # Relational operators are vectorised scores <- c(45, 78, 90, 62) scores >= 60 # FALSE TRUE TRUE TRUE
هناك عادتان توفران الوقت هنا. استخدم == للمقارنة و <- للتخصيص، لأن استخدام = واحد داخل شرط يُعد خطأً شائعًا بين المبتدئين. وتجنب استخدام == مع الأعداد العشرية: فالتقريب في الأعداد العشرية يعني أن 0.1 + 0.2 == 0.3 هو خطأ، لذا فإن isTRUE(all.equal(0.1 + 0.2, 0.3)) هو الاختبار الصحيح. المقارنات على إطارات البيانات المصنفة اتبع نفس القواعد.
ر منطقية Operaالاختصاصات
باستخدام عوامل التشغيل المنطقية، نريد إرجاع القيم داخل المتجه بناءً على شروط منطقية. يسرد الجدول أدناه عوامل التشغيل المنطقية المتوفرة في لغة R.
تُغلّف العبارات المنطقية في لغة R داخل الأقواس المربعة []. يمكننا إضافة أي عدد نريده من العبارات الشرطية، ولكن يجب وضعها بين قوسين. يمكننا اتباع هذا الهيكل لإنشاء عبارة شرطية:
variable_name[(conditional_statement)]
باستخدام `variable_name` للإشارة إلى المتغير الذي نريد استخدامه في العبارة، نُنشئ العبارة المنطقية، على سبيل المثال `variable_name > 0`. وأخيرًا، نستخدم الأقواس المربعة لإنهاء العبارة المنطقية. فيما يلي مثال على عبارة منطقية.
مثال 1: قارن كل عنصر من عناصر المتجه
# Create a vector from 1 to 10
logical_vector <- c(1:10)
logical_vector>5
الإخراج:
## [1]FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE
في المخرجات أعلاه، يقرأ برنامج R كل قيمة ويقارنها بالعبارة المنطقية logical_vector>5. إذا كانت القيمة أكبر من خمسة، فإن الشرط صحيح، وإلا فهو خاطئ. يُرجع R متجهًا يحتوي على القيمتين TRUE وFALSE.
مثال 2: احتفظ فقط بالعناصر المتطابقة
في المثال أدناه، نريد أن نستعرضtract القيم التي تحقق شرط "أكبر من خمسة تمامًا". ولتحقيق ذلك، يمكننا وضع الشرط بين قوسين مربعين مسبوقين بالمتجه الذي يحتوي على القيم.
# Print value strictly above 5
logical_vector[(logical_vector>5)]
الإخراج:
## [1] 6 7 8 9 10
مثال 3: دمج شرطين
# Print 5 and 6
logical_vector <- c(1:10)
logical_vector[(logical_vector>4) & (logical_vector<7)]
الإخراج:
## [1] 5 6
يستخدم المثال 3 علامة العطف المفردة & عن قصد. تقارن المعاملات المكونة من حرف واحد & و | المتجهات عنصرًا بعنصر وتعيد متجهًا، وهو ما يتطلبه تقسيم المجموعة. أما الصيغ المزدوجة && و || فتعيد قيمة واحدة وتندرج ضمن شروط if() و while(). R 4.3.0 (G)تمرير وسيط أطول من عنصر واحد إلى && أو || يُعد خطأً وليس تحذيرًا، لذا لم يعد بالإمكان استخدام العائلتين بشكل تبادلي. ينفي المعامل ! الشرط، بينما تُجري الدالة xor() عملية OR الحصرية.
مهمة R Operaالاختصاصات
تربط عوامل الإسناد قيمةً باسم. توفر لغة R عددًا أكبر منها مقارنةً بمعظم اللغات، وتكمن أهمية هذه الاختلافات عند نقل التعليمات البرمجية إلى وظائف.
| المُشغل | الوصف |
|---|---|
| <- | التعيين الأيسر، الخيار الاصطلاحي في لغة R |
| = | التخصيص الأيسر، ولكنه عادةً ما يكون محجوزًا لوسائط الدالة |
| -> | التعيين الصحيح، صحيح ولكنه نادر الاستخدام |
| << - | مهمة فائقة تبحث في البيئات المحيطة |
| - >> | التعيين الإشرافي الصحيح |
# Left assignment -- the idiomatic form count <- 5 # Equals sign: works, but reserve it for function arguments count = 5 round(3.14159, digits = 2) # Right assignment 5 -> count # Superassignment, used inside functions to reach an outer scope count <<- 5
توصي أدلة الأسلوب باستخدام <- لإنشاء الكائنات و = لتسمية الوسائط داخل الاستدعاء، لأن هذين الدورين يظلان متميزين بصريًا. استخدم <<- باعتدال: فهو يُغير الكائن خارج الدالة الحالية ويجعل فهم الكود أكثر صعوبة. بمجرد أن تعتاد على التعيين والأنواع، تكون الخطوات التالية هي استيراد بيانات حقيقية وريشاping انه مع com.dplyr؛ ال نظرة عامة على لغة R يضع سلسلة الأدوات بأكملها في سياقها الصحيح.

