Menu
Coddy logo textTech

אינדוקס לוגי

חלק מהיחידה יסודות במסלול ה-R של Coddy. שיעור 68 מתוך 78.

במקום לציין מיקומים מדויקים, אפשר להשתמש בווקטור לוגי כדי לבחור איברים. הטכניקה הזאת, שנקראת אינדוקס לוגי, מאפשרת לסנן וקטור לפי תנאים ולא לפי מיקומים.

כשמחילים השוואה על וקטור, R מחזירה וקטור לוגי באותו אורך:

numbers <- c(10, 20, 30, 40, 50)
print(numbers > 25)

פלט:

[1] FALSE FALSE  TRUE  TRUE  TRUE

אפשר להשתמש בווקטור הלוגי הזה ישירות בתוך סוגריים מרובעים כדי לחלץ את האיברים המתאימים:

numbers <- c(10, 20, 30, 40, 50)
print(numbers[numbers > 25])

פלט:

[1] 30 40 50

‏R שומרת רק את האיברים שבהם הווקטור הלוגי הוא TRUE. הגישה הזאת נקייה הרבה יותר מכתיבת לולאות לסינון נתונים. אפשר לשלב תנאים באמצעות אופרטורים לוגיים:

numbers <- c(10, 20, 30, 40, 50)
print(numbers[numbers >= 20 & numbers <= 40])

פלט:

[1] 20 30 40

אינדוקס לוגי הוא אחת התכונות החזקות ביותר של R לעיבוד נתונים, ומאפשר לסנן מערכי נתונים באמצעות ביטויים פשוטים וקריאים.

challenge icon

אתגר

קל

תקבל שתי שורות קלט:

  1. רשימת מספרים מופרדת בפסיקים (למשל, 15,42,8,67,23,91,34,12,56)
  2. שני ערכי סף המופרדים בפסיק ומייצגים טווח (למשל, 20,60)

באמצעות אינדוקס לוגי:

  1. צור וקטור מספרי מהמספרים המופרדים בפסיקים
  2. חלץ והדפס את כל האיברים שקטנים מ־ערך הסף הראשון (הגבול התחתון)
  3. חלץ והדפס את כל האיברים שגדולים מ־ערך הסף השני (הגבול העליון)
  4. חלץ והדפס את כל האיברים שנמצאים בתוך הטווח (גדולים מערך הסף הראשון או שווים לו וגם קטנים מערך הסף השני או שווים לו)

לדוגמה, אם הקלט הוא:

5,25,10,45,60,15,80,35,50
20,50

הפלט צריך להיות:

[1]  5 10 15
[1] 60 80
[1] 25 45 35 50

הסבר:

  • איברים הקטנים מ־20: 5, 10, 15
  • איברים הגדולים מ־50: 60, 80
  • איברים בין 20 ל־50 (כולל): 25, 45, 35, 50

השתמש באופרטור & כדי לשלב תנאים עבור סינון הטווח.

נסו בעצמכם

# קראו את הקלט
con <- file("stdin", "r")
numbers_input <- suppressWarnings(readLines(con, n = 1))
thresholds_input <- suppressWarnings(readLines(con, n = 1))
close(con)

# המירו את המספרים המופרדים בפסיקים לווקטור מספרי
numbers <- as.numeric(unlist(strsplit(numbers_input, ",")))

# המירו את ערכי הסף
thresholds <- as.numeric(unlist(strsplit(thresholds_input, ",")))
lower_bound <- thresholds[1]
upper_bound <- thresholds[2]

# TODO: כתבו את הקוד שלכם למטה
# 1. השתמשו באינדוקס לוגי כדי לחלץ איברים הקטנים מ-lower_bound והדפיסו אותם
# 2. השתמשו באינדוקס לוגי כדי לחלץ איברים הגדולים מ-upper_bound והדפיסו אותם
# 3. השתמשו באינדוקס לוגי עם האופרטור & כדי לחלץ איברים בטווח (כולל הגבולות) והדפיסו אותם
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה יסודות

תרגלו בעצמכם: קומפיילר R אונליין