اگر بخش مربوط به تبدیل و پاکسازی به درستی، دقت و بطور کامل صورت نگرفته باشد، مدلی که در مراحل بعدی تولید خواهد شد، مناسب نخواهد بود.
از کتابخانههای محبوب در زبان برنامهنویسی R، کتابخانه dplyr و tidyr است که بعضی از توابع آن وظایف تبدیل و پاکسازی دادهها را انجام میدهند. در این متن به بررسی توابع gather, spread, separate و unite از کتابخانه tidyr میپردازیم.
نکته: اگر این کتابخانه بر روی نرمافزار R، نصب نشده باشد، میتوانید از دستور زیر برای نصب آن اقدام کنید. برای این کار باید به اینترنت متصل باشد.
install.packages("tidyr")
library ("tidyr")
گاهی نیاز است که شیوه نگهداری اطلاعات در یک مجموعه داده تغییر کند. فرض کنید اطلاعات به صورت تجمیعی در یک جدول مانند تصویر زیر قرار گرفتهاند. برای انجام تحلیل روی دادهها احتیاج داریم که ستونهای time و growth را در یک متغیرهای جداگانه ثبت کنیم. تابع gather() این کار به خوبی انجام میدهد.
کدهای زیر به منظور ایجاد چنین مجموعه دادههای نوشته شدهاند. متغیر country کد کشور و q1_2017 تا q4_2017 نیز نشانگر فصلهای مختلف سال ۲۰۱۷ هستند. در داخل جدول زیر متغیر میزان رشد در هر مقطع و هر کشور ثبت شده است.
messy <- data.frame(
country = c("A", "B", "C"),
q1_2017 = c(0.03, 0.05, 0.01),
q2_2017 = c(0.05, 0.07, 0.02),
q3_2017 = c(0.04, 0.05, 0.01),
q4_2017 = c(0.03, 0.02, 0.04))
messy
> messy
country q1_2017 q2_2017 q3_2017 q4_2017
1 A 0.03 0.05 0.04 0.03
2 B 0.05 0.07 0.05 0.02
3 C 0.01 0.02 0.01 0.04
حال میخواهیم مانند تصویر قبلی، مجموعه داده را به صورتی درآوریم که هر متغیرها بخصوص مقدارهای درون جدول به صورت یک متغیر جداگانه ثبت و نگهداری شوند. کد دستوری زیر به این منظور نوشته شده است. همانطور که مشخص است تابع gather() از کتابخانه tidyr به کار رفته است.
# Reshape the data
tidier = gather(messy, quarter, growth, q1_2017:q4_2017)
tidier
gather(data, key, value, na.rm = FALSE)
Arguments:
-data: The data frame used to reshape the dataset
-key: Name of the new column created
-value: Select the columns used to fill the key column
-na.rm: Remove missing values. FALSE by default
data = چارچوب داده که باید تغییر کند.
key = نام ستون یا ستون هایی که باید ایجاد شود.
value = نام ستونی از چارچوب داده که باید ستون های جدید را مقدار دهی کند.
na.rm = برای داده های گمشده
همانطور که مشخص است پارامتر اول این دستور مجموعه دادهای است که باید تغییر کند. همچنین پارامترهای دوم و سوم نیز بیانگر متغیرهایی است که باید ایجاد شوند. پارامتر آخر نیز مجموعه مقدارهایی است که باید پارامترهای دوم و سوم از آن استخراج شوند. در نتیجه خروجی دستور بالا به صورت زیر در خواهد آمد.
> tidier
country quarter growth
1 A q1_2017 0.03
2 B q1_2017 0.05
3 C q1_2017 0.01
4 A q2_2017 0.05
5 B q2_2017 0.07
6 C q2_2017 0.02
7 A q3_2017 0.04
8 B q3_2017 0.05
9 C q3_2017 0.01
10 A q4_2017 0.03
11 B q4_2017 0.02
12 C q4_2017 0.04
توابع gather() و spread() عکس یکدیگر عمل میکنند. بنابراین اگر میخواهید مجموعه داده را به صورت تجمیعی درآورید و ستونها گسترش یابند، از تابع spread() استفاده کنید. پارامترهای این تابع نیز به مانند پارامترهای تابع gather() است. در ادامه به معرفی بعضی از این پارامترها پرداختهایم.
spread(data, key, value)
arguments:
data: The data frame used to reshape the dataset
key: Column to reshape long to wide
value: Rows used to fill the new column
مثال 1:
برای مثال فرض کنید که چارچوب داده tidier که در مثال قبل ایجاد شد را میخواهیم به صورت تجمیعی درآوریم بطوری که مقدارهای متغیر quarter در سطرهای جدول و مقدارهای growth نیز درون جدول جای گیرند. کد زیر به این منظور تهیه شده است.
messy_again=spread(tidier,quarter, growth)
messy_again
> messy_again=spread(tidier,quarter, growth)
> messy_again
country q1_2017 q2_2017 q3_2017 q4_2017
1 A 0.03 0.05 0.04 0.03
2 B 0.05 0.07 0.05 0.02
3 C 0.01 0.02 0.01 0.04
فرض کنید مقدارهای یک متغیر یا ستون را باید به دو ستون یا دو متغیر مجزا تفکیک کنیم. همانطور که به یاد دارید در چارچوب اطلاعاتی tidier، متغیر quarter شامل سال و فصل بود. مثلا یکی از مقدارهای این متغیر به صورت q1_2017 نوشته شده است. اگر بخواهیم سال را از فصل جدا کنیم، تابع separate() انتخاب خوب و مناسبی برای انجام این کار است.
پارامترهای این تابع به صورت زیر است. جدولی که در ادامه دیده میشود، به معرفی این پارامترها پرداخته است.
separate(data, col, into, sep= "", remove = TRUE)
arguments:
-data: The data frame used to reshape the dataset
-col: The column to split
-into: The name of the new variables
-sep: Indicates the symbol used that separates the variable, i.e.: "-", "_", "&"
-remove: Remove the old column. By default sets to TRUE.
برای جداسازی متغیر quarter و ایجاد دو متغیر Qrt و Year برای ثبت فصل و سال در چارچوب داده tidier از کد زیر استفاده میکنیم. مشخص است که علامت جداکننده در اینجا “_” است.
separate_tidier=separate(tidier,quarter,c("Qrt","Year"),sep="_")
> separate_tidier
country Qrt Year growth
1 A q1 2017 0.03
2 B q1 2017 0.05
3 C q1 2017 0.01
4 A q2 2017 0.05
5 B q2 2017 0.07
6 C q2 2017 0.02
7 A q3 2017 0.04
8 B q3 2017 0.05
9 C q3 2017 0.01
10 A q4 2017 0.03
11 B q4 2017 0.02
12 C q4 2017 0.04
توابع unite() و separate() عکس یکدیگر عمل میکنند. به این ترتیب با تابع unite() قادر هستیم مقدارهایی دو متغیر را در یک متغیر قرار دهیم.
unit(data, col, conc ,sep= "", remove = TRUE)
arguments:
-data: The data frame used to reshape the dataset
-col: Name of the new column
-conc: Name of the columns to concatenate
-sep: Indicates the symbol used that unites the variable, i.e: "-", "_", "&"
-remove: Remove the old columns. By default, sets to TRUE
همانطور که در قسمت قبل دیدید، متغیرهای Qrt و Year را ایجاد کردیم. حال قصد داریم این مقدارهای متغیرها را ترکیب کرده و در یک متغیر جدید به نام Quarter قرار دهیم. کد زیر به این منظور تهیه شده است.
unit_tidier=unite(separate_tidier, Quarter, Qrt, Year, sep ="_")
> unit_tidier
country Quarter growth
1 A q1_2017 0.03
2 B q1_2017 0.05
3 C q1_2017 0.01
4 A q2_2017 0.05
5 B q2_2017 0.07
6 C q2_2017 0.02
7 A q3_2017 0.04
8 B q3_2017 0.05
9 C q3_2017 0.01
10 A q4_2017 0.03
11 B q4_2017 0.02
12 C q4_2017 0.04
خلاصه
دوره های آموزشی ما برای کنکور ارشد و دکتری رشته های روانشناسی، مشاوره، علوم تربیتی، پرستاری, مدیریت آموزشی و علوم شناختی کاربرد دارد.