דמיטרי
4 דקות קריאה
02 Apr
לוגיקה ולולאות בשפת R למתחילים – להבין ולהשתמש נכון

חשיבה לוגית ב־R – לשלוט בזרימה של הקוד

כמו שאתם מקבלים החלטות ביומיום ("אם יורד גשם – קח מטריה"), גם הקוד שלכם צריך לקבל החלטות. זה מה שבלוגיקה של R: לבנות תנאים, לבצע פעולות לפי תוצאה, ולעבור בלולאות לפי הצורך.

תנאים (If / Else) – קבלת החלטות בקוד

דוגמה בסיסית:

x <- 10
if (x > 5) {      print("המספר גדול מ־5") } else {      print("המספר קטן או שווה ל־5") }

איך זה עובד:

  • if בודק תנאי.
  • אם הוא נכון – מתבצעת פעולה אחת.
  • אחרת – else תופס ומבצע פעולה אחרת.

תנאים משולבים – else if

x <- 5
if (x > 10) {      print("גדול מ־10") } else if (x > 5) {      print("גדול מ־5") } else {      print("5 או פחות") }

טיפ: סדר הבדיקות חשוב – התנאי הראשון שמתקיים "מנצח" והאחרים לא נבדקים.

לולאות – לחזור על אותו קוד, רק עם ערכים משתנים

for loop – הלולאה הכי בסיסית.

for (i in 1:5) {      print(paste("מספר:", i)) }

מה קורה כאן?

  • המשתנה i עובר על הערכים 1 עד 5.
  • בכל פעם – שורה אחת של הקוד מתבצעת עם i החדש.

while loop – כל עוד תנאי מתקיים

x <- 1
while (x <= 5) {
     print(x)  
     x <- x + 1
}

שימו לב: צריך לשנות את x בתוך הלולאה, אחרת הלולאה תמשיך לנצח (infinite loop).

שילוב לוגיקה בתוך לולאות

for (i in 1:10) {
     if (i %% 2 == 0) {
          print(paste(i, "הוא זוגי"))
     } else {
          print(paste(i, "הוא אי-זוגי"))  
     }
}
  • כאן אנחנו משתמשים בתנאי בתוך לולאה.
  • %/% מחלק שלם, %% נותן שארית – כלומר בדיקת זוגיות.

טיפ למתקדמים: פונקציות ממשפחת apply

במקום לולאות ארוכות – הרבה פעמים apply או sapply עושים עבודה נקייה ומהירה:

nums <- c(1, 2, 3, 4, 5)
squared <- sapply(nums, function(x) x^2)
print(squared)

לולאות מורכבות – ועכשיו גם עם סטטיסטיקה

דוגמה: לחשב ממוצע לכל עמודה בטבלה (data.frame)

לפעמים רוצים לעבור על עמודות שלמות ולחשב ערך סטטיסטי לכל אחת. נניח שיש לנו טבלת ציונים:

grades <- data.frame(
     math = c(90, 80, 70),
     english = c(85, 95, 75),
     history = c(88, 92, 85)
)

עם לולאת for:

for (col in names(grades)) {
     avg <- mean(grades[[col]])
     print(paste("הממוצע של", col, "הוא", round(avg, 2)))
}
  • names(grades) מחזיר את שמות העמודות.
  • grades[[col]] נותן לנו את כל הערכים בעמודה אחת.
  • mean() מחשב ממוצע.

דוגמה: לחשב סטיית תקן לכל עמודה

for (col in names(grades)) {
     sd_val <- sd(grades[[col]])
     print(paste("סטיית התקן של", col, "היא", round(sd_val, 2)))
}

דוגמה: לולאה שמבצעת פעולה רק אם יש תנאי מסוים (למשל, ממוצע גבוה מ־85)

for (col in names(grades)) {
     avg <- mean(grades[[col]])
     if (avg > 85) {
          print(paste("הממוצע של", col, "גבוה מ־85:", avg))
     }
}

ניתוח לפי קבוצות – שימוש בלולאה על פקטורים

נניח שיש לנו טבלת משתתפים עם ציון וקבוצת ניסוי:

data <- data.frame(
     group = c("A", "A", "B", "B", "C"),
     score = c(80, 90, 75, 85, 95)
)

ניתוח ממוצע לכל קבוצה:

groups <- unique(data$group)
for (g in groups) {      group_data <- data[data$group == g, ]      avg_score <- mean(group_data$score)      print(paste("הממוצע של קבוצה", g, "הוא", avg_score)) }
  • unique() מחלץ את כל הקבוצות השונות.
  • הפילוח נעשה לפי data$group == g.

ניתוח מתקדם – פונקציה + לולאה + הדפסה חכמה

analyze_group <- function(df) {
     groups <- unique(df$group)
     for (g in groups) {
          subset <- df[df$group == g, ]
          avg <- mean(subset$score)
          std <- sd(subset$score)
          print(paste("קבוצה", g, "-> ממוצע:", round(avg,2), "סטיית תקן:", round(std, 2)))
     }
}

# שימוש:
analyze_group(data)

סיכום

בפוסט הזה למדנו איך לשלוט בזרימת הקוד באמצעות תנאים (if, else) ולולאות (for, while), וכיצד ניתן לשלב ביניהן. הבנו גם מתי נכון להשתמש בכל אחת מהן, ואיך אפשר להחליף לולאות מסורבלות בפונקציות חכמות כמו apply.

הנקודות העיקריות

  • if ו־else – לבדיקת תנאים וביצוע פעולות בהתאם.
  • for – כאשר רוצים לעבור על רשימה של ערכים.
  • while – כשלא יודעים מראש כמה פעמים צריך לחזור.
  • apply – לגישה נקייה ופונקציונלית.

מה עכשיו?

רוצים להמשיך לחזק את היכולות שלכם ב־R? הציצו במדריך שלנו למתחילים או במדריך על פונקציות ופייפליין ב־R (אם עוד לא קראתם), והתחילו לבנות תהליכים מודולריים ומאורגנים באמת.

הערות
* כתובת הדואר האלקטרוני לא תוצג באתר.