כמו שאתם מקבלים החלטות ביומיום ("אם יורד גשם – קח מטריה"), גם הקוד שלכם צריך לקבל החלטות. זה מה שבלוגיקה של R: לבנות תנאים, לבצע פעולות לפי תוצאה, ולעבור בלולאות לפי הצורך.
דוגמה בסיסית:
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
או 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 (אם עוד לא קראתם), והתחילו לבנות תהליכים מודולריים ומאורגנים באמת.