Menu
Coddy logo textTech

סיכומי קבוצות

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-R של Coddy. שיעור 40 מתוך 64.

tapply(values, groups, f) מקבצת את הערכים ומפעילה את f על כל קבוצה בקריאה אחת. היא מחזירה את אותה התוצאה כמו sapply(split(values, groups), f):

amounts <- c(10, 20, 30, 40)
category <- c("food", "rent", "food", "fun")
print(tapply(amounts, category, sum))
print(tapply(amounts, category, max))

פלט:

food  fun rent 
  40   40   20 
food  fun rent 
  30   40   20 

התוצאה נקראת על שם הקבוצה בסדר ממוין, כך ש־[[ ]] קורא קבוצה אחת ו־names() מציג את שמותיהן:

amounts <- c(10, 20, 30, 40)
category <- c("food", "rent", "food", "fun")
avg <- tapply(amounts, category, mean)
print(avg[["food"]])
print(names(avg))

פלט:

[1] 20
[1] "food" "fun"  "rent"

פונקציית הסיכום יכולה להיות פונקציה משלך. כאן היא סופרת את ההזמנות שמעל 25 בכל קבוצה:

amounts <- c(10, 20, 30, 40)
category <- c("food", "rent", "food", "fun")
print(tapply(amounts, category, function(v) sum(v > 25)))

פלט:

food  fun rent 
   1    1    0 

התוצאה היא וקטור עם שמות, ולכן sort() ו־which.max() מוצאות את הקבוצה הגדולה ביותר. which.max() מחזירה את הראשונה מבין הערכים השווים:

amounts <- c(10, 20, 30, 40, 5)
category <- c("food", "rent", "food", "fun", "rent")
totals <- tapply(amounts, category, sum)
print(names(totals)[which.max(totals)])
print(names(sort(totals, decreasing = TRUE)))

פלט:

[1] "food"
[1] "food" "fun"  "rent"
challenge icon

אתגר

קל

השלם את city_report(cities, temps). החזר שורה אחת לכל עיר בסדר אלפביתי, oslo: avg 4.5, max 9, עם הטמפרטורה הממוצעת מעוגלת לספרה אחת אחרי הנקודה והטמפרטורה הגבוהה ביותר. לאחר מכן הוסף את Warmest: ואחריו את העיר עם הממוצע הגבוה ביותר (הראשונה בסדר אלפביתי במקרה של ממוצעים שווים).

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

נסו בעצמכם

city_report <- function(cities, temps) {
  # כתבו כאן את הקוד שלכם
  character(0)
}

# קוד קלט/פלט שסופק: השאירו אותו כפי שהוא
input <- suppressWarnings(readLines(file("stdin")))
cat(city_report(strsplit(input[1], ",")[[1]], as.numeric(strsplit(input[2], ",")[[1]])), sep = "\n")
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה לוגיקה וזרימת תוכנית

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