زبان برنامهنویسی R – خود را با این ۲۳ سوال محک بزنید


زبان برنامهنویسی R یکی از محبوبترین زبانهای برنامهنویسی بین دوستداران علم دادههاست (data science). اگر واقعا به علم دادهها علاقهمندید، احتمالا یا زبان برنامهنویسی R را بلدید یا در حال یادگرفتن آن هستید. زبان برنامهنویسی R همچنین شامل اکوسیستمهای متعددی از کتابخانههای داده و آمار است. به عنوان بخشی از برنامه «DataFest 2017»، سوالات زیر برای آزمایش دانش دوستداران و کاربران زبان برنامهنویسی R از این برنامه تدوین شده است.
سوالها و جوابها
متن و سوال شماره ۱
تابع زیر را در نظر بگیرید:
اگر دستور زیر را انجام دهیم، خروجی چه خواهد بود؟
الف) ۱۲
ب) ۷
ج) ۴
د) ۱۶
جواب:
در قوانین زبان برنامهنویسی R ،z<-4 قبل از z<-10 اجرا میشود. در نتیجه (g(x برابر با ۸ خواهد شد. در نتیجه جواب الف صحیح است.
متن و سوال شماره ۲
مجموعه دادههای iris دارای گونههای مختلف گل مانند Setosa، Versicolor و Virginica با طول Sepal مخصوص به خودند. در حال حاضر، ما میخواهیم توزیع طول sepal در تمام گونههای گل را درک کنیم. یک راه برای این کار این است که این رابطه را از طریق نمودار زیر نشان دهید.
کدام یک از توابع زیر برای چنین گرافی مناسب است؟
الف) xyplot
ب) stripplot
ج) barchart
د) bwplot
جواب:
طرح بالا از نوع نواری است در حالی که گزینه الف، ج و د به ترتیب طرح پراکنده، نوار و جعبهای تولید میکنند. در نتیجه گزینه ب صحیح است.
متن و سوال شماره ۳
فایل زیر با نام (Dataframe.csv) را در نظر بگیرید.
Alpha | 125.5 | 0 |
Beta | 235.6 | 1 |
Beta | 212.03 | 0 |
Beta | 211.30 | 0 |
Alpha | 265.46 | 1 |
کدام یک از دستورات زیر فایل بالا را به درستی در یک قابل داده با ۵ ردیف میخواند؟
الف) csv(‘Dataframe.csv’)
ب) csv(‘Dataframe.csv’,header=TRUE)
ج) dataframe(‘Dataframe.csv’)
د) csv2(‘Dataframe.csv’,header=FALSE,sep=’,’)
جواب:
گزینه ۱ و ۲ اولین ردیف را به عنوان هدر (header) میخواند. گزینه ۳ وجود ندارد. در نتیجه گزینه د درست است.
متن و سوال شماره ۴
فرمت اکسل یکی از فرمتهای رایج برای ذخیرهی دادهها است. بسیار ضروری است روشهای وارد کردن دادهها از فایل اکسب به زبان برنامهنویسی R را یاد بگیریم. در فایل زیر با نام (Dataframe.xlsx)، دادهها در صفحهی سوم (third sheet) وارد شدهاند.
Alpha | 125.5 | 0 |
Beta | 235.6 | 1 |
Beta | 212.03 | 0 |
Beta | 211.30 | 0 |
Alpha | 265.46 | 1 |
کدام یک از دستورهای زیر دادههای جدول فوق را به یک قالب داده در زبان برنامهنویسی R انتقال میدهد؟
الف) Openxlsx::read.xlsx(“Dataframe.xlsx”,sheet=3,colNames=FALSE)
ب) Xlsx::read.xlsx(“Dataframe.xlsx”,sheetIndex=3,header=FALSE)
ج) XLConnect::readWorksheetFromFile(“Dataframe.xlsx”,sheet=3,header=FALSE)
د) همه دستورهای بالا
جواب:
تمام گزینههای بالا درست است. تمام دستورهای بالا به درستی دادهها را از صفحهی سوم اکسل فراخوانی میکند.
متن و سوال شماره ۵
نام فایل: (Dataframe.csv)
A | 10 | Sam |
B | 20 | Peter |
C | 30 | Harry |
D | ! | ? |
E | 50 | Mark |
دادههای ناموجود با علامت تعجب (!) و علامت سوال (؟) مشخص شدهاند. کدام یک از دستورات زیر دادههای بالا را به درستی در زبان برنامهنویسی R میخواند؟
الف) csv(‘Dataframe.csv’)
ب) csv(‘Dataframe.csv’,header=FALSE, sep=’,’,na.strings=c(‘?’))
ج) csv2(‘Dataframe.csv’,header=FALSE,sep=’,’,na.strings=c(‘?’,’!’))
د) dataframe(‘Dataframe.csv’)
جواب:
گزینه الف نمیتواند (!) و (؟) را به شکل NA در زبان برنامهنویسی R بخواند. گزینه ب نیز تنها قادر به خواندن (؟) است. گزینه د وجود ندارد. در نتیجه گزینه ج درست است.
متن و سوال شماره ۶-۷
نام فایل: (Dataframe.csv)
Column 1 | Column 2 | Column 3 | |
Row 1 | 15.5 | 14.12 | 69.5 |
Row 2 | 18.6 | 56.23 | 52.4 |
Row 3 | 21.4 | 47.02 | 63.21 |
Row 4 | 36.1 | 56.63 | 36.12 |
۶- فایل بالا هم اسم ستون و هم اسم سطر دارد. کدام یک از دستورها زیر به خوبی فایل بالا را در زبان برنامهنویسی R میخواند؟
الف) delim(‘Train.csv’,header=T,sep=’,’,row.names=TRUE)
ب) csv2(‘Train.csv’,header=TRUE, row.names=TRUE)
ج) dataframe(‘Train.csv’,header=TRUE,sep=’,
د) csv(‘Train.csv’,,header=TRUE,sep=’,’)
جواب:
در گزینه الف و ب تنها بردار حاوی نام ردیف واقعی یا یک عدد را به ستون جدول نسبت میدهد که شامل نامهای ردیف و نه یک مقدار منطقی است. گزینه ج وجود ندارد. بنابراین، گزینه د راه حل درست است.
۷- کدامیک از دستورها زیر تنه دو ردیف اول فایل را میخواند؟
الف) csv(‘Dataframe.csv’,header=TRUE,row.names=1,sep=’,’,nrows=2
ب) csv2(‘Dataframe.csv’,row.names=1,nrows=2)
ج) delim2(‘Dataframe.csv’,header=T,row.names=1,sep=’,’,nrows=2)
د) dataframe(‘Dataframe.csv’,header=TRUE,row.names=1,sep=’,’,skip.last=2)
جواب:
گزینه ب نمیتواند فایل را به درستی بخواند چراکه جداکننده default در تابع csv2، “;” است در حالی که در فایلهای csv، “,”. گزینه ج نیز مقدار header argument اشتباهی دارد. گزینه د وجود ندارد. در نتیجه گزینه الف درست است.
متن و سوال شماره ۸
دو فایل داده با نامهای (Dataframe1) و (Dataframe2) در زیر وجود دارد.
Dataframe1
| Dataframe2
|
کدام یک از دستورها نتایج نشان داده شده در زیر را نشان میدهد؟
Feature1 | Feature2 | Feature3 |
A | 1000 | 25.5 |
B | 2000 | 35.5 |
C | 3000 | 45.5 |
D | 4000 | 55.5 |
E | 5000 | 65.5 |
F | 6000 | 75.5 |
G | 7000 | 85.5 |
H | 8000 | 95.5 |
الف) merge(dataframe[,1:3],dataframe2)
ب) merge(dataframe1,dataframe2)[,1:3]
ج) merge(dataframe1,dataframe2,all=TRUE)
د) گزینه الف و ب
ه) همه گزینهها
جواب:
گزینه ج منجر به خواندن feature 4 میشود که مورد نظر ما نیست. لذا گزینه د صحیح است.
متن و سوال شماره ۹:
دادههای زیر را در نظر بگیرید (dataframe).
V1 | V2 | |
1 | 121.5 | 461 |
2 | 516 | 1351 |
3 | 451 | 6918 |
4 | 613 | 112 |
5 | 112.36 | 230 |
6 | 25.23 | 1456 |
7 | 12 | 457 |
این دادهها در زبان برنامهنویسی R خوانده و در متغیر «dataframe» ذخیره شدهاند. کدام یک از دستورهای زیر چکیده (میانگین، مد و میانه) دادهها را در یک خط نشان میدهد؟
الف) summary(dataframe)
ب) stats(dataframe)
ج) summarize(dataframe)
د) summarise(dataframe)
ه) هیچ کدام
جواب:
گزینه الف تنها میانگین و میانه را میدهد. گزینه ب، ج و د نیز قادر به ارائه مقادیر مورد نیاز نیستند. در نتیجه گزینه ه درست است.
متن و سوال شماره ۱۰
یک سری داده در زبان برنامهنویسی R خوانده و در متغیر «dataframe» ذخیره شدهاند. دادههای ناموجود با NA نشان داده شده است.
A | 10 | Sam |
B | NA | Peter |
C | 30 | Harry |
D | 40 | NA |
E | 50 | Mark |
کدام یک از دستورهای زیر تعداد دادههای ناموجود در هر ستون را نمیدهد؟
الف) colSums(is.na(dataframe))
ب) apply(is.na(dataframe),2,sum)
ج) sapply(dataframe,function(x) sum(is.na(x))
د) table(is.na(dataframe))
جواب:
گزینه د تعداد تمام دادههای ناموجود را میدهد اما نه به ازای هر ستون. در نتیجه گزینه د صحیح است.
متن و سوال شماره ۱۱
یکی از فازهای مهم در تحلیل دادهها (Data Analytics)، تحلیل غیرمستقیم از ویژگیهایی شامل چک کردن مقادیر گمشده و توزیع آنها و .. است. در ادامه یک مجموعه داده (dataframed)وجود دارد و میخواهیم هیستوگرامی برای متغیر «Value» رسم کنیم.
Parameter | State | Value | Dependents |
Alpha | Active | 50 | 2 |
Beta | Active | 45 | 5 |
Beta | Passive | 25 | 0 |
Alpha | Passive | 21 | 0 |
Alpha | Passive | 26 | 1 |
Beta | Active | 30 | 2 |
Beta | Passive | 18 | 0 |
کدام یک از دستورهای زیر به ما در انجام این کار کمک میکند؟
الف) hist(dataframed$Value)
ب) ggplot2::qplot(dataframed$Value,geom=”Histogram”)
ج) ggplot2::ggplot(data=dataframed,aes(dataframe$Value))+geom_histogram()
د) همه گزینهها
جواب:
تمام گزینههای فوق میتوانند هیستوگرام رسم کنند که برای مشاهده ناهمواری (skewness ) دادهها مناسب است.
متن و سوال شماره ۱۲
جدول (Parameter) زیر را در نظر بگیرید.
Parameter | State | Value | Usage |
Alpha | Active | 50 | 0 |
Beta | Active | 45 | 1 |
Beta | Passive | 25 | 0 |
Alpha | Passive | 21 | 0 |
Alpha | Passive | 26 | 1 |
Beta | Active | 30 | 1 |
Beta | Passive | 18 | 0 |
الگوریتمهای خاص مانند XGBOOST تنها با دادههای عددی کار میکنند. در این حالت، متغیرهای دستهای (categorical variable) موجود در دادهها در ابتدا به متغیرهای DUMMY تبدیل میشود. این متغیرها نمایندهی حضور یا عدم حضور سطحی از متغیر دستهای در دادهها هستند. برای مثال بعد از ایجاد متغیر DUMMY برای «Parameter»، سری دادهها به شکل زیر خواهد بود.
Parameter_Alpha | Parameter_Beta | State | Value | Usage |
1 | 0 | Active | 50 | 0 |
0 | 1 | Active | 45 | 1 |
0 | 1 | Passive | 25 | 0 |
1 | 0 | Passive | 21 | 0 |
1 | 0 | Passive | 26 | 1 |
0 | 1 | Active | 30 | 1 |
0 | 1 | Passive | 18 | 0 |
کدام یک از دستورهای زیر به ما کمک میکند چنین کنیم؟
الف) dummies:: dummy.data.frame(dataframe,names=c(‘Parameter’))
ب) dataframe$Parameter_Alpha=0
dataframe$Gende_Beta=0
dataframe$Parameter_Alpha[which(dataframe$Parameter==’Alpha’)]=1
dataframe$Parameter_Beta[which(dataframe$Parameter==’Alpha’)]=0
dataframe$Parameter_Alpha[which(dataframe$Parameter==’Beta’]=0
dataframe$Parameter_Beta[which(dataframe$Parameter==’Beta’]=1
ج) contrasts(dataframe$Parameter)
د) گزینه الف و ب
جواب:
گزینهی ج ستون Parameter را با دو سطح رمزنگاری (encode) میکند اما «hot encoding» اجرا نمینماید. لذا گزینه د درست است.
متن و سوال شماره ۱۳
جدول داده (dataframe) زیر را در نظر بگیرید.
Column1 | Column2 | Column3 | Column4 | Column5 | Column6 | |
Name1 | Alpha | 12 | 24 | 54 | 0 | Alpha |
Name2 | Beta | 16 | 32 | 51 | 1 | Beta |
Name3 | Alpha | 52 | 104 | 32 | 0 | Gamma |
Name4 | Beta | 36 | 72 | 84 | 1 | Delta |
Name5 | Beta | 45 | 90 | 32 | 0 | Phi |
Name6 | Alpha | 12 | 24 | 12 | 0 | Zeta |
Name7 | Beta | 32 | 64 | 64 | 1 | Sigma |
Name8 | Alpha | 42 | 84 | 54 | 0 | Mu |
Name9 | Alpha | 56 | 112 | 31 | 1 | Eta |
میخواهیم رابطه بین «Column2»و «Column3» را بررسی کنیم. کدام یک از دستورهای زیر به ما کمک میکند؟
الف) corr(dataframe$column2,dataframe$column3)
ب) cov(dataframe$column2,dataframe$column3))/(var(dataframe$column2)*sd(dataframe$column3))
ج)
(sum(dataframe$Column2*dataframe$Column3)- (sum(dataframe$Column2)*sum(dataframe$Column3)/nrow(dataframe)))/(sqrt((sum(dataframe$Column2*dataframe$Column2)-(sum(dataframe$Column2)^3)/nrow(dataframe))* (sum(dataframe$Column3*dataframe$Column3)-(sum(dataframe$Column3)^2)/nrow(dataframe))))
د) هیچ کدام
جواب:
در گزینه الف، corr دستور اشتباهی است. دستور مناسب برای محاسبه رابطه cor است. در گزینه ب، این انحراف استاندارد است که باید معیار باشد و نه واریانس. به شکل مشابه، فرمول گزینه ج اشتباه است. در نتیجه گزینه د صحیح است.
متن و سوال شماره ۱۴
جدول داده زیر با نام «dataframe» را در نظر بگیرید.
Parameter | State | Value | Dependents |
Alpha | Active | 50 | 2 |
Beta | Active | 45 | 5 |
Beta | Passive | 25 | 0 |
Alpha | Passive | 21 | 0 |
Alpha | Passive | 26 | 1 |
Beta | Active | 30 | 2 |
Beta | Passive | 18 | 0 |
دادههای بالا برای شما در زبان برنامهنویسی R در یک متغیر با نام «dataframe» بارگذاری شده است. ردیف اول نماینده نام هر ستون است. کدام یک از دستورات زیر تنها ردیفهایی با پارامتر Alpha را انتخاب میکند؟
الف) subset(dataframe, Parameter=’Alpha’)
ب) subset(dataframe, Parameter==’Alpha’)
ج) filter(dataframe,Parameter==’Alpha’)
د) گزینه ب و ج
ه) تمام گزینهها
جواب:
در گزینه الف به جای عملگر تساوی (equality operator) از عملگر انتصاب (assignment operator) استفاده شود. در نتیجه گزینه د درست است.
متن و سوال شماره ۱۵
از کدام یک از توابع زیر برای مشاهده دادهها در فرمت مشابه «spreadsheet» استفاده میشود؟
الف) disp()
ب) View()
ج) seq()
د) همه گزینهها
جواب:
گزینه ب تنها گزینهای است که این کار را برای ما انجام میدهد.
متن و سوال شماره ۱۶
قالب دادههای زیر در متغیری با نام «» ذخیره شده است.
A | B |
1 | Right |
2 | Wrong |
3 | Wrong |
4 | Right |
5 | Right |
6 | Wrong |
7 | Wrong |
8 | Right |
فرض کنید که B یک متغیر دستهای است و میخواهید یک «boxplot» برای هر سطح از هر دسته رسم کنیم. کدام یک از دستورهای زیر به ما برای این هدف کمک میکند؟
الف) boxplot(A,B,data=data)
ب) boxplot(A~B,data=data)
ج) boxplot(A|B,data=data)
د) هیچ کدام
جواب:
تابع Boxplot در زبان برنامهنویسی R برای این کار نیاز به یک ورودی فرمول برای کشیدن boxplots با سطوح مختلف یک متغیر دارد. در نتیجه گزینه ب درست است.
متن و سوال شماره ۱۷
کدام یک از دستورهای زیر صفحه رسم را به یک پنجره ۴ * ۳ تبدیل میکند در حالی که تصاویر به پنجره بر حسب ستون وارد میشوند؟
الف) par(split=c(4,3))
ب) par(mfcol=c(4,3))
ج) par(mfrow=c(4,3))
د) par(col=c(4,3))
جواب:
«mfcol» باعث وارد شدن تصاویر بر حسب ستون میشود. در نتیجه گزینه ب درست است.
متن و سوال شماره ۱۸
دادهها با نام «df» به شکل زیرند:
Dates
2017-02-28
2017-02-27
2017-02-26
2017-02-25
2017-02-24
2017-02-23
2017-02-22
2017-02-21
پس از خواندن دادههای بالا، میخواهیم خروجیهای زیر را داشته باشیم.
Dates
28 Tuesday Feb 17
27 Monday Feb 17
26 Sunday Feb 17
25 Saturday Feb 17
24 Friday Feb 17
23 Thursday Feb 17
22 Wednesday Feb 17
21 Tuesday Feb 17
کدام یک از دستورهای زیر خروجی مورد نظر را به ما میدهد؟
الف) format(df,”%d %A %b %y”)
ب) format(df,”%D %A %b %y”)
ج) format(df,”%D %a %B %Y”)
د) هیچ کدام
جواب:
هیچ کدام از دستورهای بالا عمل مورد نظر را برای ما انجام نمیدهد. در نتیجه گزینه د صحیح است.
متن و سوال شماره ۱۹
کدام یک از دستورات زیر به ما برای تغییر نام ستون دوم قالب داده با نام «table» از alpha به beta کمک میکند؟
الف) colnames(table)[2]=’beta’
ب) colnames(table)[which(colnames==’alpha’)]=’beta’
ج) setnames(table,’alpha’,’beta’)
د) همه گزینهها
جواب:
گزینه د صحیح است.
متن و سوال شماره ۲۰
زبان برنامهنویسی R با بسیاری از دادههای پرحجم سروکار دارد. در نتیجه پاک کردن دادههای بلااستفاده در زبان برنامهنویسی R بسیار مفید است. کدام یک از دستورات زیر یک متغیر یا object با نام «santa» را از محیط کار (workspace) حذف میکند؟
الف) remove(santa)
ب) rm(santa)
ج) هر دو
د) هیچ کدام
جواب:
دستورات «remove» و «rm» هر دو برای پاک کردن محیط کار استفاده میشوند. در نتیجه گزینه ج صحیح است.
متن و سوال شماره ۲۱
«dplyr» یک بسته محبوب در زبان برنامهنویسی R برای بازی با دادهها است. این بسته شامل پنج تابع اصلی برای کنترل دادهها است. کدام یک از گزینههای زیر یکی از پنج تابع اصلی نیست؟
الف) select()
ب) filter()
ج) arrange()
د) summary()
جواب:
«summary» تابعی در زبان برنامهنویسی R است که در dplyr وجود ندارد. در نتیجه گزینه د صحیح است.
متن و سوال شماره ۲۲
طی انتخاب «Feature» با اسفاده از دادههای زیر با نام «table» ستون یک و دوم به عنوان اطلاعات نامرتبط شناخته شدهاند. در نتیجه باید در مدلسازی ما حذف شوند.
Column1 | Column2 | Column3 | Column4 | Column5 | Column6 | |
Name1 | Alpha | 12 | 24 | 54 | 0 | Alpha |
Name2 | Beta | 16 | 32 | 51 | 1 | Beta |
Name3 | Alpha | 52 | 104 | 32 | 0 | Gamma |
Name4 | Beta | 36 | 72 | 84 | 1 | Delta |
Name5 | Beta | 45 | 90 | 32 | 0 | Phi |
Name6 | Alpha | 12 | 24 | 12 | 0 | Zeta |
Name7 | Beta | 32 | 64 | 64 | 1 | Sigma |
Name8 | Alpha | 42 | 84 | 54 | 0 | Mu |
Name9 | Alpha | 56 | 112 | 31 | 1 | Eta |
کدام یک از دستورهای زیر تمام ردیفها را از ستون سوم تا متن و سوال شمارهم انتخاب میکند؟
الف) dplyr::select(table,Column3:Column6)
ب) table[,3:6]
ج) subset(table,select=c(‘Column3’,’Column4’,’Column5’,’Column6’))
د) تمام گزینههای بالا
جواب:
تمام دستورهای فوق میتوانند نتیجه مورد نظر را به ما بدهند. لذا گزینه د صحیح است.
متن و سوال شماره ۲۳
جدول دادههای زیر را با نام «table» در نظر بگیرید.
Column1 | Column2 | Column3 | Column4 | Column5 | Column6 | |
Name1 | Alpha | 12 | 24 | 54 | 0 | Alpha |
Name2 | Beta | 16 | 32 | 51 | 1 | Beta |
Name3 | Alpha | 52 | 104 | 32 | 0 | Gamma |
Name4 | Beta | 36 | 72 | 84 | 1 | Delta |
Name5 | Beta | 45 | 90 | 32 | 0 | Phi |
Name6 | Alpha | 12 | 24 | 12 | 0 | Zeta |
Name7 | Beta | 32 | 64 | 64 | 1 | Sigma |
Name8 | Alpha | 42 | 84 | 54 | 0 | Mu |
Name9 | Alpha | 56 | 112 | 31 | 1 | Eta |
کدام یک از دستورهای زیر ردیفهای شامل مقادیر «Alpha» در ستون اول و مقادیر کمتر از ۵۰ در ستون چهارم را به ما میدهد؟
الف) dplyr::filter(table,Column1==’Alpha’, Column4<50)
ب) dplyr::filter(table,Column1==’Alpha’ & Column4<50)
ج) هر دو گزینه الف و ب
د) هیچ کدام
جواب:
تابع فیلتر در بسته dplyr از «,» و «&» برای اضافه کردن شرایط استفاده میکند. در نتیجه گزینه ج صحیح است.
امیدواریم مطالعه این مقاله، برای شما مفید واقع شده باشد. اگر به یادگیری در این زمینه علاقه دارید، مطالب زیر را به شما پیشنهاد میکنیم:
- آموزش برنامهنویسی R و نرمافزار R Studio
- آموزش داده کاوی و زبان برنامه نویسی R
- پایتون، R یا SAS؟ کدام بهتر است؟
#