أنواع البيانات في R مع مثال

⚡ ملخص ذكي

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

  • 🔘 Atomأنواع الدوائر المتكاملة: يخزن برنامج R كل قيمة كقيمة منطقية، أو عدد صحيح، أو عدد عشري، أو عدد مركب، أو حرف، أو قيمة خام.
  • ☑️ التحقق من النوع: تصف الدوال class() و typeof() و mode() قيمة من ثلاث زوايا مختلفة.
  • ثلاثة أبعاد: تقوم الدالة c() بإنشاء مجموعة أحادية البعد حيث يشترك كل عنصر في نوع واحد.
  • 🧪 Operaتورس: تغطي عوامل التشغيل الحسابية والعلائقية والمنطقية وعوامل التخصيص جميع تعبيرات لغة R الأساسية تقريبًا.
  • 🛠️ تقسيم المجموعة الفرعية: الأقواس المربعة المقترنة بشرط منطقي لتصفية عناصر المتجه في سطر واحد.
  • ⚠️ ملاحظة حول الإصدار: قام الإصدار R 4.3.0 بتحويل وسيطة طولها أكبر من واحد إلى && أو || إلى خطأ.

أنواع البيانات في 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 مع معانيها

تُغلّف العبارات المنطقية في لغة 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 يضع سلسلة الأدوات بأكملها في سياقها الصحيح.

الأسئلة الشائعة

يحتوي المتجه على عناصر من نوع واحد فقط، ويؤدي خلط الأنواع إلى فرض التحويل. أما القائمة، فتحتوي على أي شيء في كل خانة، بما في ذلك القوائم الأخرى، وإطارات البيانات، أو الدوال، ولهذا السبب تُعتبر كائنات النموذج قوائم.

عندما يلتقي متجهان مختلفا الطول مع عامل، يكرر R المتجه الأقصر حتى يتطابق طولهما. على سبيل المثال، c(1,2,3,4) + c(1,2) ينتج عنه 2 4 4 6. يظهر تحذير فقط عندما لا يكون الطول الأطول من مضاعفات المتجه الأقصر.

يشير NA إلى قيمة مفقودة داخل متجه. يشير NULL إلى غياب عنصر ما، ويكون طوله صفرًا. NaN هي نتيجة عددية غير مُعرَّفة، مثل 0/0. Inf هي القسمة على صفر، كما في 1/0.

يختبر عامل التشغيل %in% الانتماء ويعيد القيمة TRUE لكل عنصر في الطرف الأيسر من المتجه الموجود في الطرف الأيمن. على سبيل المثال، c(2,7) %in% c(1,2,3) يُعيد TRUE FALSE. ويستبدل هذا العامل سلاسل طويلة من مقارنات == الموصولة بـ |.

اختيار البخور بالنسبة للشبكات العددية والجبر الخطي، أ إطار البيانات بالنسبة للجداول التي تختلف أعمدتها في النوع، و الإدارية عندما تكون للعناصر أشكال مختلفة.

تم تقديمها في R 4.1.0، تقوم أداة |> بتمرير القيمة الموجودة على يسارها إلى الوسيط الأول للدالة الموجودة على يمينها. وهي تربط الخطوات دون استدعاءات متداخلة ولا تحتاج إلى حزمة، على عكس أداة magrittr %>% pipe.

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

نعم. يتضمن RStudio 2023.09.0 والإصدارات الأحدث مساعد الطيار جيثب تكامل يُكمل تعابير R مباشرةً. يتطلب ذلك اشتراك Copilot، ويجب على المسؤولين تفعيله على RStudio Server أو Posit Workbench.

تلخيص هذه التدوينة بـ: