برای مشاهده یافته ها از کلید Enter و برای خروج از کلید Esc استفاده کنید.

ماتریس ها

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

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

ایجاد ماتریس

برای ایجاد یک ماتریس در R از دستوری مشابه دستور زیر استفاده می شود.

matrix(1:6,nrow = 3,ncol = 2)

##   [,1] [,2]

## [1,] 1  4

## [2,] 2  5

## [3,] 3  6

دردستور بالا، نخستین آرگومان، داده های مورد نظر را تعیین می کند که طبیعتا می تواند از منابع مختلفی (مانند یک فایل) تامین شود. آرگومان دوم، تعداد سطرها و آرگومان سوم، تعداد ستون های ماتریس را تعیین می کند. البته این دستور را بدون استفاده از کلمات کلیدی، به صورت زیر هم می توان بازنویسی کرد.

matrix(1:6,3,2)

در صورت تعیین نکردن یکی از ابعاد ماتریس در زمان ایجاد آن، تابع matrix به صورت خودکار و برطبق شرایط موجود بعد دیگر را مدیریت می کند. به مثال زیر توجه کنید.

matrix(1:6,ncol=3)

##   [,1] [,2] [,3]

## [1,] 1  3  5

## [2,] 2  4  6

در این مثال با اینکه تعداد سطرها تعیین نشده است، R براساس تعداد عناصر داده ای موجود و محدودیت تعیین شده یعنی وجود سه ستون، ماتریسی با سه ستون و دو سطر ایجاد می کند. با تغییر دستور بالا با مشخص کردن تعداد سطرها به جای ستون ها، ساختار ماتریس ایجاد شده به شکل زیر تغییر می کند.

matrix(1:6,nrow=3)

##   [,1] [,2]

## [1,] 1  4 

## [2,] 2  5

## [3,] 3  6

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

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

نکته قابل توجه در مثال نخست این است که برای هفت عنصر داده ای، تنها تعداد سطرهای آرایه تعیین شده اند. برای اینکه این داده ها بتوانند در قالبی استاندارد در آرایه قرار بگیرند، باید آرایه به گونه ای ایجاد شود که ابعاد آن، کمینه (مینیمم) ظرفیت پذیرش داده ها را داشته باشند. به بیانی ساده تر، برای ذخیره کردن هفت آیتم داده ای در ساختاری که تعداد سطرهای آن برابر با سه می باشد، کوچکترین آرایه ممکن باید یک آرایه 3 در 3 باشد که در اینصورت دو جایگاه خالی باقی مانده به شیوه ای که پیشتر با آن آشنا شدیم، پر خواهند شد.

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

بسته به شرایط و کاربردی که مدنظر داریم، ممکن است نیاز باشد تا برای سطرها و ستون ها نام های با معنی انتخاب کنیم. این موضوع زمانی بیشتر اهمیت پیدا می کند که پس از مدتی قصد اصلاح یک برنامه را داریم که پیشتر روی آن کار می کردیم یا زمانیکه یک برنامه بین چند برنامه نویس به اشتراک گذاشته می شود. درچنین مواردی، نامگذاری سطرها و ستون ها باعث افزایش خوانایی و قابلیت یادآوری جهت ویرایش و مدیریت برنامه می شود. برای انجام این کار از دو تابع ()colnames و ()rownames به صورت زیر استفاده می شود.

فایده دیگر نامگذاری سطرها و ستون های ماتریس این است که می توانیم به صورت با معنا تری به عناصر دسترسی داشته باشیم و این فرایند را تسهیل کنیم. در مثال بالا، به صورت کلاسیک با استفاده از اندیس ها به عناصر دسترسی داریم.

mat_1[2,3]
# 10

حال با استفاده از نامگذاری انجام شده می توان فرایند مورد نظر را به صورت با معناتری انجام داد.

mat_1["F", "C"]
# 10

همچنین، همانطور که قابل حدس است، می توان تنها با اشاره به سطر یا ستون مشخصی، به تمامی داده های آن سطر یا ستون دسترسی پیدا کرد.

mat_1["F", ]
# 2 6 10 14

mat_1[,"C"]
# 9 10 11 12

عملیات ماتریسی

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

ماتریس زیر را در نظر بگیرید.

Mat_2 <- matrix(1:12,3,4)

با استفاده از توابع colSums و rowSums می توان مجموع درایه های هر ستون و هر سطر را به سادگی محاسبه کرد.

colSums(mat_2)
# [1]  6 15 24 33
rowSums(mat_2)
# [1] 22 26 30

تابع sum هم مجموع تمامی عناصر ماتریس را به عنوان خروجی محاسبه می کند.

sum(mat_2)
# [1]  78

به طریقی مشابه، توابع colMeans، rowMeans و mean  به ترتیب میانه عناصر ستون ها، سطرها و تمامی عناصر ماتریس را محاسبه می کند.

برای مشخص کردن ابعاد یک ماتریس هم می توان از تابع dim استفاده کرد.

dim(mat_2)
# [1] 3 4