
כמו שאתם מקבלים החלטות ביומיום ("אם יורד גשם – קח מטריה"), גם הקוד שלכם צריך לקבל החלטות. זה מה שבלוגיקה של R: לבנות תנאים, לבצע פעולות לפי תוצאה, ולעבור בלולאות לפי הצורך.
דוגמה בסיסית:
x <- 10
if (x > 5) { print("המספר גדול מ־5") } else { print("המספר קטן או שווה ל־5") }
איך זה עובד:
if בודק תנאי.else תופס ומבצע פעולה אחרת.else ifx <- 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 (אם עוד לא קראתם), והתחילו לבנות תהליכים מודולריים ומאורגנים באמת.