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

بردارها : بخش چهارم

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

اضافه کردن آیتم به بردارها در موقعیت های مشخص

پیش از این دیدیم که چگونه می توان یک یا چند آیتم داده ای را به یک بردار اضافه کرد. آن روش، البته، در مواردی که قصد افزودن آیتم داده ای در جایگاهی مشخص از بردار را داشته باشیم، کارایی نخواهد داشت. برای انجام این فرایند، دو سناریو مطرح است. نخست، مواردی که آیتم مورد نظر قرار است در جایگاهی قرار بگیرد که از قبل وجود ندارد! به بیان ساده تر، فرض کنیم یک بردار عددی به طول 4 داریم و به دلایلی می خواهیم یک عدد جدید در اندیس 9 آن بردار قرار بدهیم. به جای توضیحات، بیاید این فرایند را به صورت عملیاتی بررسی کنیم.

test_vec <- c(2,4,6,8)

test_vec [9] <- 18

test_vec

# [1]  2  4  6  8 NA NA NA NA 18

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

حالا که بحث به این جا رسید، خالی از لطف نیست که یک تابع مفید را هم معرفی کنیم، تابعی برای بررسی اینکه آیا مقدار موردنظر از نوع NA است یا نه؟ کاربرد این تابع را برای بررسی مثال بالا، آزمایش می کنیم.

is.na(test_vec[1])
# [1] FALSE

is.na(test_vec[5])
# [1] TRUE

is.na(test_vec)

# [1] FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE

تابع ()is.na هم برای یک مقدار مشخص که از طریق اندیس تعیین می شود و هم برای یک بردار کامل می تواند وجود مقادیر NA را بررسی کند. البته توجه داشته باشید که این تابع تنها برای بردارها نیست و هر متغیر و ساختمان داده ای را می توان با این تابع مورد بررسی قرار داد.

سناریوی دوم برای اضافه کردن آیتم های داده ای، قرار دادن آنها در جایگاه و اندیسی است که از پیش وجود دارد. این سناریو به نظر معقول تر میاید! لطفا به مثال زیر توجه کنید.

append(test_vec, 47, after = 3)
# [1] 2 4 6 47 8 NA NA NA NA 18

آنگونه که مشاهده می کنید، به کارگیری تابع append بسیار ساده است، به عنوان آرگومان نخست باید بردار مورد نظر را تعیین کرد، سپس مقداری که قرار است به بردار اضافه شود مشخص می شود و در انتها و با استفاده از کلمه کلیدی after جایگاه و اندیس موردنظر را برای قرارگیری آیتم جدید تعیین می کنیم. دوباره یادآوری می شود که در R اندیس ها از یک شروع می شوند.

البته اگر تجربه کار با زبان های برنامه نویسی دیگر را داشته باشید به تفاوت تابع append در زبان R و سایر زبان ها پی برده اید. در اغلب زبان های برنامه نویسی این تابع عنصر داده ای جدیدی را به انتهای ساختار مورد نظر اضافه می کند.

به عنوان یک ترفند به این نکته توجه داشته باشید که برای قرار دادن یک عنصر در ابتدای بردار باید مقدار after را برابر با صفر قرار دهید.

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

ترکیب بردارها

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

همانند مباحثی که پیشتر به آن ها پرداخته شد، ترکیب ستونی و سطری هم ممکن است برای دو بردار با طول یکسان یا با اندازه های متفاوت انجام شود.

برای ترکیب ستونی از تابع ()cbind به شیوه زیر استفاده می شود. لطفا به نتیجه ترکیب بردارهای هم اندازه و غیر هم اندازه توجه کنید. همچنین، توجه داشته باشید که پیغام هشداری که (به علت عدم یکسان بودن طول بردارها) در ادامه مشاهده خواهید کرد در روند اجرای برنامه خللی ایجاد نمی کند.

v1 <- c(1,2,3)
v2 <- c(4,5,6)
v3 <- c(7,8)
cbind(v1,v2)
#      v1 v2
# [1,] 1 4
# [2,] 2 5
# [3,] 3 6

cbind(v1,v3)
#      v1 v2
# [1,] 1 7
# [2,] 2 8
# [3,] 3 7
# Warning message
#In cbind(v1, v3):
#number of rows of result is not a multiple of vector length (arg 2)

برای ترکیب سطری داده ها هم از تابع ()rbind استفاده می شود.

rbind(v1,v2)
#  [,1] [,2] [,3]
# v1 1 2 3
# v2 4 5 6

rbind(v1,v3)
#  [,1] [,2] [,3]
# v1 1 2 3
# v2 7 8 7
# Warning message
#In rbind(v1, v3):
#number of columns of result is not a multiple of vector length (arg 2)

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