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

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

در ادامه بررسی بردارها در زبان R، به معرفی تابع ()seq می رسیم. همانطور که گفته شد این تابع برای تولید یک بردار از عناصر داده ای متوالی مورد استفاده قرار می گیرد. (البته لازم به یادآوری نیست (!) که می توان خروجی این تابع را در یک متغیر ذخیره کرد و از آن برای سایر کارها استفاده نمود.)

در ساده ترین حالت، با استفاده از دستور ()seq می توان یک دنباله عددی به تعداد دلخواه و با شروع از عدد یک ایجاد کرد.

seq(8)

# [1] 1 2 3 4 5 6 7 8

به عنوان نخستین آپشن (!!) می توان محدوده این دنباله را تعیین کرد.

seq(2,7)

# [1] 2 3 4 5 6 7

البته گام یا فاصله بین عناصر دنباله را هم می توان به صورت مشخص تعریف کرد:

seq(4,7,0.4)

# [1] 4.0 4.4 4.8 5.2 5.6 6.0 6.4 6.8

مثال بالا را با استفاده از کلمات کلیدی رزرو شده R نیز می توان بازنویسی کرد:

seq(from=4,to=7,by=0.4)

برای تعیین طول دنباله هم به روش زیر عمل می کنیم.

seq(from=5,to=40,length.out=8)
# [1] 5 10 15 20 25 30 35 40

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

seq(6,12,length.out=5)
# [1] 6.0 7.5 9.0 10.5 12.0

تعیین طول بردار

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

vec_11 <- c (2:8)
length (vec_11)
# [1] 7

vec_12 <- c ("one", "two", "three", "four")
length (vec_12)
# [1] 4

دسترسی به عناصر بردار

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

num_vec <- c (2, 4, 5, 6, 13, 18)
num_vec [2]
# [1] 4

با استفاده از تابع ()c می توان در یک زمان به بیش از یک عنصر بردار هم دسترسی داشت.

num_vec [c(2,5)]
# [1] 4 13

برای دسترسی به عناصر بردار می توان شرط های منطقی نیز تعیین کرد.

num_vec [num_vec > 7]
# [1] 13 18

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

char_vec <- c("R", "Python", "C#", "HTML", "JS”)
char_vec[c(-1)]
# [1] "Python" "C#" "HTML" "JS"

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

برای دسترسی به عناصر بردارها می توان از الگوی کلید – مقدار هم به صورت زیر استفاده کرد:

key_vec <- c("first" = 828, "second" = 181, "third" = 819)
key_vec ["first"]
# first

828

cat(key_vec ["first"], "\n")
# 828

تغییر عناصر بردار

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

char_vec [3] <- "CSS"
char_vec
# [1] "R" "Python" "CSS" "HTML" "JS"

ایجاد بردار با عناصر تکراری

در کاربردهای خاصی ممکن است نیاز به ایجاد عناصر تکراری در یک بردار داشته باشیم. برای انجام ساده و راحت این عملیات می توان از تابع ()rep استفاده کرد.

rep_vec <- rep (2,5)
rep_vec
# [1] 2 2 2 2 2

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

rep_vec <- rep (c(2,3,4), each=2)
rep_vec
# [1] 2 2 3 3 4 4

آرگومان each هریک از عناصر را به تعداد تعیین شده تکرار می کند ولی آرگومان times سری مورد نظر را به صورت کامل به تعداد مشخص شده تکرار می کند.

rep_vec <- rep (c(2,3,4), times=2)
rep_vec
# [1] 2 3 4 2 3 4

این عملیات را می توان به شیوه جالب تری هم انجام داد، به این صورت که هر یک از عناصر را به تعداد دلخواه تکرار کرد.

rep_vec <- rep (c(2,3,4), times= c(4,3,5))
rep_vec
# [1] 2 2 2 2 3 3 3 4 4 4 4 4

مرتب کردن عناصر بردار

زمانیکه با بردارها و مجموعه ها کار می کنیم، مرتب سازی عناصر اهمیت بالایی دارد. تابع ()sort این فرایند را برای ما انجام می دهد.

sort_vec <- c(10, 23,8, 32, 4,1, 19)
sort(sort_vec)
# [1] 1 4 8 10 19 23 32

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

sort(sort_vec, decreasing = TRUE)
# [1] 32 23 19 10 8 4 1

نکته : به جای مقادیر منطقی TRUE و FALSE می توان از T و F نیز استفاده کرد.

حذف بردار

حذف بردار از دو جنبه قابل بررسی است: حذف یک عنصر مشخص یا حذف بردار به صورت کامل و یک جا. برای هدف نخست، باید از دستور in به صورت زیر استفاده کرد.

rm_vec <- c(1,34,56,2,45,67,89,22,21,38)
rm_vec
# [1] 1 34 56 2 45 67 89 22 21 38
rm_vec <- rm_vec[! rm_vec %in% c(34,45)]
rm_vec
# [1] 1 56 2 67 89 22 21 38

در این مثال دو آیتم را از بردار حذف کردیم و با انتساب مجدد عملیات حذف به بردار اولیه (rm_vec) نتیجه را ماندگار کردیم. در غیر اینصورت (یعنی تنها با اجرا و نمایش خروجی سمت راست دستور خط 4 و عدم انتقال نتیجه به بردار اولیه) این عملیات به صورت مجازی انجام می شود و اثر آن به بردار اصلی منتقل نمی شود.

برای حذف کامل یک بردار می توانیم به صورت زیر عمل کنیم. البته توجه داشته باشید که این عملیات بردار را از حافظه حذف نمی کند و برای این منظور باید از دستور ()rm که پیشتر راجع به آن صحبت شد، استفاده کرد.

rm_vec <- NULL
rm_vec
# NULL
ls()
# [1] "rm_vec"