آموزش زبان R برای علوم داده: مباحث مقدماتی

در این مقاله به موضوعات مقدماتی شامل نحوه تخصیص یک متغیر، کار با بردارها، ماتریس‌ها و قالب‌های داده و همچنین توابع پایه‌ای و پرکاربرد ریاضی و آماری می‌پردازم. رویکرد من در آموزش زبان برنامه‌نویسی R بیشتر مبتنی بر استفاده از مثال است تا خواننده با اجرای کدها بتواند این زبان را یاد بگیرد.

اگر R را بر روی سیستم خود نصب و آن را اجرا کنید، پنجره‌ای مانند شکل-۱ ظاهر می‌شود. در این پنجره شما قادر هستید که به کدنویسی بپردازید.

شکل-۱

قبل از پرداختن به کدنویسی توجه کنید که زبان R نسبت به بزرگ و یا کوچک بودن حروف حساس است.

نشانی فضای کاری (Work Directory)

همیشه بهتر است در ابتدا نشانی فضای کاری را مشخص کنید. این نشانی جایی در کامپیوتر شماست که R همه فایل‌ها را از آنجا می‌خواند و یا اگر فایلی را بخواهد بنویسد در این نشانی ذخیره می‌کند. برای فهمیدن این نشانی از تابع getwd استفاده می‌شود. اگر این تابع را وارد و سپس آن را اجرا کنید، نشانی فضای کاری R مشخص می‌شود. توجه کنید خروجی این تابع روی کامپیوتر شما چیز دیگری خواهد بود.

اگر بخواهید این نشانی را به آدرس دیگری تغییر دهید از تابع setwd به شکل زیر استفاده کنید. نشانیِ داخلِ تابع جایی است که می‌خواهیم فضای کاری جدید قرار گیرد. به نحوه آدرس‌دهی حتماً توجه کنید. اگر دوباره از تابع getwd استفاده کنید، مشاهده می‌کنید نشانی فضای کاری تغییر کرده است.

تخصیص ورودی (Entering Input)

برای تخصیص یک عبارت به یک متغیر از نماد -> استفاده می‌شود (می‌توان از علامت = نیز استفاده کرد). در مثال زیر عدد ۱۰ به متغیر x تخصیص داده شده است. اگر بخواهید x را فراخوانی کنید به‌راحتی می‌توانید آن را تایپ کرده و Enter را فشار دهید یا از تابع print به ترتیب زیر استفاده کنید. همچنین در زیر کلمه hello به متغیر txt تخصیص داده شده است.

در بالا وقتی x را فراخوانی می‌کنید، [۱] نشان می‌دهد که x یک بردار است که اولین  مؤلفه آن ۱۰ است. البته در اینجا x تنها یک مؤلفه دارد.

برای این‌که کدهایمان خواناتر و گویاتر شود، ممکن است برای یادآوری بخواهیم جلوی هر کد عبارات و نکاتی را بنویسم تا برای خودمان و یا دیگران مشخص کنیم که آن بخش از کد با چه هدفی نوشته شده است. برای این منظور، در ابتدای کد از علامت # استفاده می‌کنیم. این علامت به R یادآوری می‌کند که لازم نیست آن قسمت را اجرا کند.

انواع شیء (Object) در R

تمام چیزهایی که در R با آن‌ها سروکار داریم شیء نامیده می‌شوند. درواقع شیء مانند اتم می‌ماند؛ کوچک‌ترین جزء تشکیل‌دهنده R است. پنج کلاس اصلی آن به ترتیب زیر است:

کاراکتر (Character) به هر نشانه‌ای گفته می‌شود که مورد پردازش متنی قرار می‌گیرد مانند a ،B ،۲ و غیره.

اعداد حقیقی (Numeric)

اعداد صحیح (Integer)

اعداد موهوم (Complex)

خروجی منطقی (Logical) که دلالت بر درستی یا نادرستی یک گزاره دارند.

یکی از پایه‌ای‌ترین اشیاء در R بردار (Vector) است. بردارها در بیشتر موارد شامل اشیائی از یک کلاس هستند.

اغلب اعداد به شکل اعداد حقیقی در R ذخیره می‌شوند. حتی وقتی شما عددی مانند ۲ را می‌بینید، در پشت پرده این عدد به شکل یک عدد حقیقی ذخیره‌شده است. این امکان وجود دارد که آن را به شکل صریح در کلاس اعداد صحیح قرار دهید و یا آن را به شکل کاراکتر تعریف کنید. اگر یک عدد را به شکل کاراکتر تعریف کنیم، آنگاه نمی‌توان محاسبات ریاضی روی آن انجام داد.

در کد زیر، ابتدا عدد ۲ را به متغیر x تخصیص دادم، با تابع class، کلاس آن را فراخوانی کردم و سپس آن را با تابع as.character به کاراکتر برگرداندم. دقت کنید وقتی x به شکل کاراکتر برگردانده شده است، خروجی آن در داخل گیومه به نمایش درمی‌آید. حال اگر x را در یک محاسبه ریاضی مانند جمع بکار ببرم، پیام خطا دریافت می‌کنم. با استفاده از تابع as.numeric دوباره می‌توان x را به کلاس اعداد حقیقی تبدیل کرد.

ساختارهای داده (Data Structures)

در زبان R می‌توان داده‌ها را به روش‌های مختلف سازمان‌دهی کرد. من در ادامه مقاله به روش‌های متداول زیر اشاره می‌کنم:

بردارها (Vectors)

ماتریس‌ها (Matrices)

لیست‌ها (Lists)

قالب‌های داده (Data Frames)

بردارها

از تابع c می‌توان برای ساخت برداری از اشیاء استفاده کرد. به مثال‌های زیر توجه کنید:

توجه کنید که بردار d3 از ترکیب دو بردار d1 و d2 به دست ‌آمده و مؤلفه‌های بردار d5 از کلاس منطقی هستند. روش‌های دیگری نیز وجود دارد که می‌توان با آن بردار ایجاد کرد. برای نمونه در زیر برای تخصیص اعداد طبیعی از ۱ تا ۱۰ به بردار d6 از عملگر : استفاده کردم:

اگر بخواهید سری اعداد ۱ تا ۱۰ را (شروع از ۱) بافاصله دوتادوتا وارد کنید، از کد زیر باید استفاده کرد:

اگر بخواهید از بین سری اعداد ۱ تا ۱۰ (شروع از ۱) یک بردار با چهار مؤلفه انتخاب کنید که فاصله آن‌ها از یکدیگر برابر باشد، از کد زیر باید استفاده کرد:

اگر طول این بردار بخواهد ۵ باشد، به شکل زیر عمل می‌کنیم:

اگر بخواهیم یک بردار از مجموعه اعداد تکراری ایجاد کنیم، از تابع rep استفاده می‌کنیم:

همچنین اگر بخواهیم طول یک بردار را محاسبه کنیم از تابع length استفاده می‌کنیم:

برای انتخاب دومین عنصر بردار d6 و انتخاب هم‌زمان سومین و چهارمین عنصر بردار d6 از کدهای زیر استفاده کردم:

اگر بخواهیم عناصر یک بردار را به ترتیب بزرگ به کوچک یا برعکس مرتب کنیم می‌توان از تابع sort استفاده کرد.

در کد بالا توجه کنید چون decreasing = TRUE قرار گرفته است، مقادیر از بزرگ به کوچک مرتب شده‌اند، در غیراینصورت مقادیر از کوچک به بزرگ مرتب می‌شدند.

برخی از توابع ریاضی پایه (Basic Math Functions)

در این جا تنها به برخی از توابع پرکاربرد ریاضی اشاره می‌کنم.

به مثال‌های زیر که کاربرد توابع بالا را نشان می‌دهد توجه کنید:

توابع آماری پایه (Basic Statistical Functions)

 توابع پرکاربرد آماری در R را نیز در جدول زیر خلاصه کردم:

مثال‌های زیر کاربرد توابع بالا را نشان می‌دهد:

توابع منطقی پایه (Logical Functions)

 در کد زیر ابتدا یک بردار تعریف کردم تا کاربرد توابع منطقی را نشان دهم.

اولین عبارت منطقی نشان می دهد آیا هر کدام از عناصر بردار مساوی عدد ۶ است یا خیر.

دومین عبارت بیان می کند چندمین عنصر مساوی عدد ۶ است.

سومین عبارت سوال می کند آیا عنصری در بردار مذکور، بزرگتر از عدد ۷ است یا خیر.

چهارمین عبارت بررسی می کند آیا همه عناصر بردار از ۷ کوچکتر مساوی هستند یا خیر.

علامت ! در R نشان دهنده نقیض یک گزینه است. پنجمین عبارت نقیض عبارت اول است.

& نشان دهنده “و” (AND) و | نشان دهنده “یا” (OR) است. آخرین عبارت می گوید آیا اعضایی در بردار وجود دارند که از ۷ بزرگتر باشند و کوچکتر مساوی ۱۰ باشند.

ماتریس‌ها

ماتریس‌ها آرایه‌ای از اعداد هستند که دارای دو بعد (سطر و ستون) هستند. برای نشان دادن نحوه کار با ماتریس‌ها در R فرض کنید ماتریس A به شکل زیر تعریف شده است:

برای تعریف ماتریس A از تابع matrix به شکل زیر استفاده می‌کنم:

در کد بالا ابتدا، بردار درایه یا عناصر ماتریس را تعریف کردم به شکلی که در دو سطر (nrow=2) و سه ستون (ncol=3) جای بگیرند. درنهایت گفته شده است که اعداد بردار مذکور سطر به سطر در ماتریس جای بگیرند. اگر بخواهیم اعداد را ستون به ستون در ماتریس جای دهیم، در انتها باید عبارت byrow = FALSE قرار داده می‌شد.

ابعاد یک ماتریس (تعداد سطر و ستون) را با استفاده از تابع dim به دست می‌آوریم.

فراخوانی درایه‌های ماتریس

اگر بخواهم درایه واقع در سطر اول و ستون سوم را فراخوانی کنم از کد زیر استفاده می‌کنم:

اگر بخواهم تمام درایه‌های سطر اول و یا تمام درایه‌های ستون دو را فراخوانی کنم، به ترتیب زیر عمل می‌کنم:

این امکان وجود دارد که برای مثال درایه‌های بیش از یک ستون را فراخوانی کنم:

می‌توان همه درایه‌های ماتریس به‌جز ستون اول را به شکل زیر انتخاب کرد:

در کد زیر تنها درایه‌هایی را انتخاب کردم که مقدار عددی آن‌ها از ۴ بزرگ‌تر است:

اگر به دنبال درایه‌هایی باشم که بر دو بخش‌پذیر هستند (اعداد زوج) از کد زیر استفاده می‌کنم:

توجه کنید در کد بالا، عملگر %% باقی‌مانده عدد سمت چپ را در تقسیم آن بر عدد سمت راست محاسبه می‌کند.

نام‌گذاری سطرها و ستون‌های ماتریس

همچنین می‌توانیم به سطرها و ستون‌های ماتریس اسم دلخواه اختصاص دهیم و درایه‌های ماتریس را با اسمشان هم فراخوانی کنیم:

با استفاده از توابع rownames و colnames می‌توانید به ترتیب سطرها و ستون‌های یک ماتریس را نام‌گذاری کنید.

ترانهاده ماتریس

برای به دست آوردن ترانهاده ماتریس A از تابع t استفاده می‌شود. جهت یادآوری ترانهاده یک ماتریس، از جابجا کردن سطرها و ستون‌های آن به دست می‌آید.

ترکیب ماتریس‌ها

اگر بخواهیم دو ماتریس را به شکل ستونی با یکدیگر ترکیب کنیم از تابع cbind استفاده می‌کنیم. به‌طور مشابه اگر بخواهیم دو ماتریس را به شکلی سطری ترکیب کنیم از تابع rbind بهره می‌بریم.

اصلاح درایه‌های ماتریس

از دستوراتی که در بالا برای فراخوانی درایه‌های ماتریس استفاده کردم، می‌توان برای اصلاح درایه‌های آن‌هم استفاده کرد.

برای مثال در کد زیر درایه واقع در سطر اول و ستون سوم، به عدد ۱۰ تغییر یافته است:

یا در کد زیر همه درایه‌های ماتریس اولیه A که مقداری کمتر از ۴ دارند، صفر شده‌اند:

در مثال زیر به همه درایه‌های ماتریس اولیه، ۵ واحد اضافه شده است:

ابعاد یک ماتریس را هم می‌توان تغییر داد. برای مثال به کد زیر توجه کنید:

همچنین با استفاده از تابع c می‌توان دوباره درایه‌های ماتریس را به شکل بردار درآورد:

دترمینان ماتریس

برای محاسبه دترمینان یک ماتریس مربعی (دارای سطرها و ستون‌های برابر) از تابع det استفاده می‌کنیم.

لیست‌ها

فهرست‌ها نوع خاصی از بردارها هستند که عناصر آن می‌توانند کلاس‌های مختلفی را در خود جای دهند. برای ساخت یک لیست  از تابع list استفاده می‌شود. در مثال زیر می‌بینید که آخرین عضو در لیست، یک بردار است.

قالب‌های داده

برای ذخیره داده‌های جدولی در R از قالب‌های داده یا دیتا فریم استفاده می‌شود. قالب‌های داده کاربرد زیادی در مدل‌سازی‌های آماری دارند. برای آن‌که به‌سادگی بتوانید آن‌ها را درک کنید، وقتی به قالب‌های داده فکر می‌کنید می‌توانید یک جدول اکسل را تصور کنید. قالب داده را می‌توان نوع خاصی از لیست در نظر گرفت که عناصر آن بردارهایی با طول یکسان هستند. به مثال زیر توجه کنید:

همان‌طور که در بالا مشخص است برخلاف ماتریس‌ها، قالب‌های داده می‌توانند کلاس‌های مختلف را در خود جای دهند. درحالی‌که درایه‌های یک ماتریس باید همگی از یک کلاس باشند.

زبان R دارای نمونه‌هایی از داده‌هاست. یکی از این نمونه‌ها mtcars نام دارد که به شکل دیتا فریم ذخیره شده است.

خط اول قالب داده سرتیتر (Header) خوانده می‌شود که حاوی اسامی ستون‌هاست. هر عضو قالب داده هم سلول نامیده می‌شود.
کار کردن با قالب داده از بسیاری جهات شبیه کار با ماتریس‌هاست. به مثال‌های زیر توجه کنید:

آخرین مثال احتمالاً نیاز به توضیح بیشتری داشته باشد. در این مثال، هدف این بوده که تنها سطرهایی انتخاب شوند که مقدار متغیر ستون am در آن‌ها ۱ باشد.

گام بعدی برای یادگیری R، نحوه خواندن و نوشتن داده‌ها و نحوه نصب بسته (Package) از کتابخانه R است. برای یادگیری این موضوعات به مقاله “آموزش زبان R برای علوم داده: خواندن و نوشتن داده‌ها” مراجعه کنید.

مقالات آموزش زبان R در آنالیکا

آموزش زبان R برای علوم داده: مباحث مقدماتی

آموزش زبان R برای علوم داده: خواندن و نوشتن داده‌ها

آموزش زبان R برای علوم داده: عبارات شرطی و حلقه‌ها

آموزش زبان R برای علوم داده: توابع

آموزش زبان R برای علوم داده: رسم نمودار

11 نظر در “آموزش زبان R برای علوم داده: مباحث مقدماتی

  • آبان ۱۵, ۱۳۹۷ در ۱:۰۴ ب٫ظ
    پیوند یکتا

    سلام
    خدا قوت
    ممنون بایت دسته بندی خوبی که در این مقاله قرار دادید.

    پاسخ
  • آذر ۱۸, ۱۳۹۷ در ۴:۳۰ ب٫ظ
    پیوند یکتا

    سلام. خسته نباشید…من حدود ۲۰ متغیر داردم و حدود ۲۰ میلیون OBSERVATION . و قصد دارم دل پانل دیتا لاجیت رگرس کنم .. نرم افزارR ظرفیت این حجم از داده ها رو داره؟

    پاسخ
    • دی ۷, ۱۳۹۷ در ۵:۳۹ ق٫ظ
      پیوند یکتا

      با سلام،

      پاسخ کوتاه شما این است که بله می‌توان با R داده‌های بزرگ را مانند آنچه شما مثال زدید تحلیل کرد. چند نکته در این خصوص به ذهنم می‌رسد که شاید برایتان مفید باشد:

      اول، قانون سرانگشتی این است که زبان R در حالت استاندارد می‌تواند بین ۱ میلیون تا ۱ میلیارد رکورد را بدون مشکل تجزیه‌وتحلیل کند. داده‌های بزرگ‌تر از این با الگوریتم‌های MapReduce تحلیل می‌شوند که در اینجا هم می‌توانید از ترکیب هادوپ (Hadoop) و R استفاده کنید.

      دوم، توجه کنید تعداد رکوردها یک برآورد سرانگشتی از حجم داده‌ها به دست می‌دهد. مهم، بزرگ‌ترین شیئی است که در طول فرآیند تحلیل ایجاد می‌شود. ممکن است شما تنها ده هزار رکورد داشته باشید ولی ماتریس فاصله برای این ده هزار رکورد در یک الگوریتم خوشه‌بندی سلسله مراتبی دارای ۵۰ میلیون فاصله است. بنابراین در کار با داده‌های بزرگ مهم است که از روش‌هایی استفاده کنید که ازنظر محاسباتی کارآمد باشد.

      سوم، در بیشتر کاربردها شما لازم ندارید از همه داده‌ها استفاده کنید بلکه می‌توانید از آن نمونه‌گیری کنید. برای پروژه شما شاید گرفتن یک نمونه ۱ تا ۲ میلیونی کفایت کند.

      چهارم، R تمام اشیاء را در حافظه RAM ذخیره می‌کند. این برای تحلیل داده‌های بزرگ مشکل‌ساز می‌شود. یک استراتژی استفاده از ماشین‌های با حافظه RAM بیشتر است. حالت دیگر این است که بسته‌هایی (Packages) مانند ff، ffbase، filehash و bigmemory استفاده کنید که اشیاء را در هارددیسک ذخیره می‌کنند.

      موفق باشید.

      پاسخ
  • بهمن ۳, ۱۳۹۸ در ۹:۱۲ ب٫ظ
    پیوند یکتا

    سلام
    من متوجه شدم برای تغییر دادن کلاس یک داده به کاراکتر یا فاکتور میشه به جای as.charachter یا as.factor از charahter و factor استفاده کرد. اما در مورد تابع as.numeric این موضوع صادق نیست.
    این توابع فرقشون چیه؟ چه دلیلی داره که نیاز باشه حتما as. رو هم بذاریم؟

    پاسخ
  • فروردین ۲۶, ۱۳۹۹ در ۶:۵۵ ب٫ظ
    پیوند یکتا

    سلام سپاس بی نهایت برای مطالب فوق العادتود

    پاسخ
  • فروردین ۳۱, ۱۳۹۹ در ۱:۵۵ ب٫ظ
    پیوند یکتا

    با سلام و خسته نباشید.میشه یه کد بهم معرفی کنید که داده های بارش یک بازه زمانی خاص مثلا سال های ۹۴-۸۷ رو برام توی نرم افزار Rتفکیک کنه . سپاسگزارمیشم پاسخگو باشید.با تشکر

    پاسخ
  • اردیبهشت ۲۱, ۱۳۹۹ در ۰:۲۸ ق٫ظ
    پیوند یکتا

    سلام ..چطور باید دستور دو بردار که برهم عمود باشند رو بنویسم؟؟؟

    پاسخ
  • مرداد ۱۷, ۱۳۹۹ در ۱۲:۵۶ ب٫ظ
    پیوند یکتا

    خدا خیر دنیا و آخرت رو بهت بده…ممنون

    پاسخ
  • بهمن ۱۳, ۱۳۹۹ در ۱۰:۱۹ ب٫ظ
    پیوند یکتا

    سلام و خسته نباشید من یه سری داده دارم که میخوام اون ها رو نرمال سازی کنم متغیر x رو چطوری معرفی کنم که شامل همه ی داده ها باشه

    پاسخ
  • اسفند ۷, ۱۴۰۰ در ۱۲:۴۲ ب٫ظ
    پیوند یکتا

    سلام
    عالیییییییییییییی بود
    ممنون

    پاسخ
  • فروردین ۱۶, ۱۴۰۱ در ۱۱:۵۲ ب٫ظ
    پیوند یکتا

    با سلام و تشکر از مطالب مفید. من یک فایل حاوی یک ستون دیتا دارم که می خواهم آنها را از فایل اصلی که شامل همان آیدی ها هستند حذف کنم چه دستوری باید بنویسم؟

    پاسخ

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.