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

در این مقاله من عمدتاً به روش‌های مختلف برای خواندن و نوشتن داده‌ها توسط نرم‌افزار R می‌پردازم. علاوه بر این در مورد نحوه شناسایی مقادیر گمشده (Missing Values) و همچنین نصب بسته (Package) از کتابخانه R بحث می‌کنم. رویکرد من در آموزش برنامه‌نویسی R بیشتر مبتنی بر استفاده از مثال است تا خواننده با اجرای کدها بتواند این زبان را یاد بگیرد.

برای آشنایی با نحوه شروع به کار با نرم‌افزار R به مقاله “آموزش نرم‌افزار R برای علوم داده: مباحث مقدماتی” مراجعه کنید.

خواندن ورودی‌های کاربر

در برخی موارد به‌ویژه حالت‌هایی که کاربر با برنامه نوشته‌شده تعامل دارد، تمایل داریم که کاربر داده را به‌صورت دستی وارد کند. توابع scan و readline در این مواقع می‌توانند کمک کنند.

تابع scan می‌تواند برای خواندن داده‌های عددی، حروف و نمادها (کاراکتر) و یا ترکیب آن دو بکار رود. در کد زیر با اجری تابع، نرم‌افزار منتظر دریافت اعداد ورودی می‌ماند تا کاربر آن‌ها را یکی‌یکی یا به‌صورت سریالی با استفاده از فاصله (Space) وارد کند. پس از فشار دادن Enter در هر بار نرم‌افزار منتظر دریافت عدد یا سری اعداد بعدی باقی می‌ماند. در انتها با دو بار فشردن کلید Enter خواندن داده‌ها تمام می‌شود.

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

تابع readline به کاربر اجازه می‌دهد تا عبارتی یک‌خطی را به‌عنوان ورودی به نرم‌افزار بدهد. این تابع را می‌توان با prompt بکار برد تا هنگام اجرای تابع پیامی نیز به کاربر نشان داده شود. در مثال زیر از این تابع استفاده شده است تا نام و سن کاربر را دریافت کند و در انتها پیامی را به کاربر نمایش دهد:

توجه کنید در مثال بالا تابع readline سن را به شکل کاراکتر دریافت می‌کند. به همین دلیل برای انجام محاسبه روی سن، آن را با استفاده از تابع as.integer به عدد صحیح تبدیل کردم.

خواندن داده از روی فایل‌

همان‌طور که در مقاله قبل اشاره کردم قالب‌های داده (Data Frames) در تحلیل‌های آماری و داده‌کاوی کاربرد زیادی دارند. این داده‌ها به‌صورت جدولی هستند و شامل مقادیر عددی و کاراکترها می‌باشند. یکی از پرکاربردترین قالب‌ها برای ذخیره کردن این نوع داده‌ها قالب CSV است. در این قالب، داده‌ها به‌صورت جدولی سازمان‌دهی و مقادیر آن توسط ویرگول از یکدیگر جدا شده‌اند (Comma-Separated Values). برای خواند چنین فایل‌هایی از روی کامپیوتر، تابع read.csv را استفاده می‌کنیم.

در مثال زیر فایل موردنظر در نشانی فضای کاری (Work Directory) وجود دارد و با استفاده از تابع read.csv فراخوانی شده است. در این تابع فرض می‌شود که ردیف اول جدول به نام متغیرها اختصاص یافته است. اگر چنین نباشد و نام متغیرها در جدول وجود نداشته باشد، کافی است مقدار header را برابر FALSE قرار دهیم. معمولاً جدول داده‌ها بسیار طولانی است. ولی برای آنکه حسی نسبت به جدول داده‌ها داشته باشیم بهتر است چند ردیف اول و چند ردیف آخر داده‌ها را به ترتیب با توابع head و tail فراخوانی کنیم تا از نوع ساختار داده‌ها مطلع شویم.

فایل مورداستفاده مثال بالا در سه قالب در زیر آمده است.

Data.csv

Data.txt

Data.xlsx

اگر فایل موردنظر در نشانی دیگری بر روی کامپیوتر قرار داشت، می‌توان آدرس کامل آن نشانی را به تابع داد تا از آنجا فراخوانی کند:

اگر فایل موردنظر از روشی به‌جز استفاده از ویرگول برای جدا کردن مقادیر داده‌ها بهره برده می‌توان تابع read.table را که حالت‌های کلی‌تر را در نظر می‌گیرد، برای خواندن داده بکار برد. در این تابع باید نشان داد که مقادیر داده‌ها با چه علامتی جدا شده‌اند. مثلاً در کد زیر به تابع گفته شده که مقادیر با علامت | از هم جدا شده‌اند:

توجه کنید برای جداول بزرگ داده بهتر است از تابع read.table استفاده کنید. در برخی موارد در جدول‌های بزرگ پیش می‌آید که تنها می‌خواهیم بخشی از داده‌ها را فراخوانی کنیم. در کد زیر من تنها ۵۰ ردیف اول داده‌ها را  فراخوانی کردم (ردیف نام متغیرها جزء این ۵۰ ردیف حساب نشده است):

داده‌های گمشده

معمولاً یکی از اولین کارهایی که پس از خواندن داده‌ها می‌کنیم، این است که بررسی کنیم آیا در جدول، داده‌های گمشده وجود دارند یا خیر. در کدهای زیر من نکات زیر را بررسی کردم:

در ستون مربوط به شماره کاربری (USERID) تعداد مقادیر گمشده را به دست آوردم. تابع is.na یک تابع با خروجی TRUE یا FALSE است و مشخص می‌کند که هر مقدار با NA برابر است یا خیر. توجه کنید در اینجا فرض شده است از همان ابتدا مقادیر گمشده به‌صورت NA ذخیره شده‌اند. خروجی مقادیر گمشده در تابع is.na معادل TRUE یا عدد ۱ است. به این ترتیب با کمک تابع sum می توان تعداد مقادیر گمشده را محاسبه کرد.

در گام بعدی نشان دادم در ستون IP چند ردیف دارای مقدار هستند. توجه کنید علامت ! یک عبارت را نقیض می‌کند.

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

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

نصب و فراخوانی بسته از کتابخانه R

برای خواندن فایل‌های اکسل (Excel) تابعی در R وجود ندارد. برای این منظور باید از بسته readxl استفاده کنید. بسته کدی است که برای انجام کار خاصی توسط جامعه توسعه‌دهندگان ایجاد شده و به‌راحتی در دسترس است. بسته‌ها به شما اجازه می‌دهد که بدون صرف انرژی زیاد از ابزارهای دیگران استفاده کنید بدون آنکه لازم باشد خودتان کدنویسی زیادی انجام دهید.

اگر بخواهید فایل‌های اکسل  را به‌صورت مستقیم در R بخوانید، می‌توانید ابتدا بسته readxl را نصب کرده و سپس از تابع read_excel که در این بسته تعریف شده برای فراخوانی فایل موردنظر بهره بگیرید. در کد زیر من ابتدا با استفاده از تابع install.packages این بسته را نصب و سپس آن را با تابع library فراخوانی کردم. پس از اجرای تابع install.packages کمی طول خواهد کشید تا فرآیند نصب تکمیل شود و دراین‌بین پیام‌هایی نیز ظاهر می‌شوند.

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

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

بسته rjson برای خواندن فایل‌های JSON

بسته XML برای خواندن فایل‌های XML

بسته foreign برای خواندن فایل‌های نرم‌افزارهای آماری مانند Minitab ، SAS ، SPSS ، STATA ، Weka و dBase

بسته RMySQL برای برقراری ارتباط با پایگاه‌های داده MySQL

خواندن داده‌ها از روی وب

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

این روش ممکن است برای خواندن صفحات وب بسیار ساده مناسب باشد، ولی برای صفحات وب پیچیده‌تر عملاً همان‌طور که در بالا می‌بینید داده‌ها بسیار خام هستند و برای تجزیه‌وتحلیل مناسب نیستند. لازم به ذکر است بسته‌های مختلفی در نرم‌افزار R برای خزیدن در اینترنت (Web Crawling) توسعه یافته‌اند که به شکل کارآمدتر اطلاعات صفحات وب را می‌خواند. این بحث خارج از موضوع این مقاله است.

روش اشاره‌شده در بالا وقتی کاربردی است که بخواهیم یک فایل حاوی داده را از صفحه وب فراخوانی کنیم. برای مثال در کد زیر من آدرس فایل Data.txt را بر روی وب‌سایت آنالیکا به تابع read.csv دادم تا آن را فراخوانی کند.

نوشتن داده‌ها

توابع write.csv و write.table برای نوشتن داده‌ها به شکل جدولی و تابع writeLines برای نوشتن داده‌ها در یک فایل متنی (قالب txt) استفاده می‌شوند. در نمونه زیر، من ابتدا جدولی از داده‌ها را به شکل قالب داده یا دیتا فریم ایجاد کردم و سپس آن را در فایل df.txt در آدرس موردنظرم ذخیره کردم. داده‌ها با تک‌فاصله از یکدیگر جدا شده‌اند. ردیف‌ها نام‌گذاری نشدند درحالی‌که سر تیترها در فایل ذخیره شده‌اند. شکل-۱ محتوای فایل df.txt را نشان می‌دهد.

شکل-۱

در مثال زیر من نحوه استفاده از تابع writeLines را برای نوشتن یک فایل متنی نشان می‌دهم. شکل-۲ محتوای این فایل متنی را نشان می‌دهد.

شکل-۲

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *