הוספת עמודה: df$new <- value
כדי להוסיף עמודה ב-R הבסיסי, בצעו השמה לשם שעדיין לא קיים. הערך מחושב בדרך כלל מעמודות שכן קיימות:
קרו שני דברים. orders$total קיבלה וקטור מלא: price * qty מחושב לכל שורה בבת אחת, כי חשבון ב-R הוא וקטורי. orders$currency קיבלה ערך בודד, ש-R מחזר לכל ארבע השורות. כל אורך אחר הוא שגיאה (replacement has 3 rows, data has 4), וזה R שמגן עליכם מעמודה לא מיושרת.
זה עובד כי data frame הוא רשימה של עמודות באורך שווה: השמה של איבר חדש עם שם מגדילה את הרשימה. המדריך על data frames מפרק את המודל הזה.
עמודות מותנות: ifelse()
עמודה שהערך שלה תלוי בתנאי צריכה ifelse(), בן הדוד הוקטורי של if. הוא מקבל וקטור שלם של תנאים ומחזיר ערך לכל שורה:
למה לא if רגיל? כי if מעריך TRUE/FALSE אחד בדיוק: כשמקבל עמודה, הוא נכשל בשגיאה (the condition has length > 1). ifelse(test, yes, no) בודק כל איבר ובוחר לכל שורה. לשלוש תוצאות או יותר אפשר לקנן:
קינון בעומק שתיים זה בסדר; שלוש או יותר הופכות לפירמידה, ובדיוק לשם כך נבנה case_when() של dplyr (בהמשך). ה-if/else לערך בודד עצמו מוסבר במדריך על if-else.
כמה עמודות בבת אחת: transform()
transform() של R הבסיסי מוסיף כמה עמודות בקריאה אחת, עם שמות עמודות חשופים:
שימו לב ש-transform() מחזיר data frame חדש: חייבים להציב את התוצאה בחזרה, בעוד ש-df$new <- ... משנה במקום. מגבלה אחת: הביטויים בתוך קריאת transform() אחת לא רואים זה את זה, ולכן discount = ifelse(total > 50, ...) נכשל שם (total עדיין לא קיים). עשו זאת בשני שלבים, או עם mutate(), שמאפשר את זה.
שינוי מול יצירה
אותו תחביר השמה דורס עמודה קיימת; ההבדל היחיד הוא אם העמודה כבר הייתה קיימת:
כדאי לעצור על זה רגע: R לא נותן שום אזהרה כשדורסים עמודה. שגיאת הקלדה כמו df$prise <- round(df$price, 2) יוצרת בשקט עמודה חדשה במקום לתקן את הישנה. אחרי שינוי, הפעילו print() או str() על הטבלה וודאו ששיניתם את מה שהתכוונתם.
הסרת עמודה
הציבו NULL כדי למחוק:
העמודה נעלמה, בלי טקסים. כדי להסיר כמה, df[, c("a", "b")] (שומר את מה שאתם מפרטים) בדרך כלל ברור יותר מ-NULL חוזרים.
הדרך של dplyr: mutate()
הפועל של dplyr לכל מה שלמעלה הוא mutate(). הקטעים הבאים סטטיים, כי סביבת ההרצה מריצה R בסיסי בלבד, אבל כך נראות אותן פעולות:
library(dplyr)
orders |>
mutate(
total = price * qty,
big = total > 50 # can use total, defined one line up
)
שני יתרונות על פני R הבסיסי. ראשית, עמודות שמוגדרות באותו mutate() יכולות להתייחס זו לזו, לפי הסדר, הדבר ש-transform() מסרב לו. שנית, פונקציות העזר המותנות טובות יותר מ-ifelse() מקונן:
students |>
mutate(
grade = if_else(score >= 60, "pass", "fail"),
band = case_when(
score >= 85 ~ "high",
score >= 60 ~ "mid",
.default = "low"
)
)
if_else() הוא ifelse() מחמיר יותר (שני הענפים חייבים להיות מאותו טיפוס, מה שתופס באגים אמיתיים). case_when() נקרא כרשימה שטוחה של זוגות condition ~ value שנבדקים מלמעלה למטה, עם .default כברירת המחדל: התחליף הקריא לפירמידת ה-ifelse(). כמו כל פועל של dplyr, mutate() מחזיר data frame חדש; ראו את המבוא ל-dplyr כדי להבין איך הוא משתרשר עם השאר.
מה לקחת מכאן
df$new <- expressionמוסיף עמודה; הביטוי רץ לכל שורה בבת אחת.ifelse(test, yes, no)בונה עמודות מותנות;ifרגיל לא יכול.transform()מוסיף כמה עמודות בכל קריאה אבל הן לא רואות זו את זו;mutate()כן.- אותה השמה דורסת בשקט: בדקו את האיות אחרי שינוי.
df$col <- NULLמסיר עמודה;case_when()מחליף פירמידות שלifelse()מקונן.
בהמשך: שינוי שמות עמודות, names(), הביטוי החסין של R הבסיסי, ו-rename() של dplyr.
שאלות נפוצות
איך מוסיפים עמודה חדשה ל-data frame ב-R?
בצעו השמה לשם עמודה שעדיין לא קיים: df$total <- df$price * df$qty. R יוצר את העמודה במקום. הערך יכול להיות ערך בודד (שממוחזר לכל שורה) או וקטור שמחושב מעמודות אחרות, כל עוד האורך שלו תואם את מספר השורות.
איך יוצרים עמודה מותנית ב-R?
השתמשו ב-ifelse() הווקטורי: df$grade <- ifelse(df$score >= 60, "pass", "fail") בודק כל שורה בבת אחת. אל תשתמשו ב-if רגיל: הוא מטפל בתנאי יחיד, לא בעמודה. ליותר משתי תוצאות, קננו קריאות ifelse() או השתמשו ב-case_when() של dplyr.
מה עושה mutate() ב-R?
mutate() הוא הפועל של dplyr להוספה או לשינוי של עמודות: df |> mutate(total = price * qty) מחזיר עותק של ה-data frame עם העמודה החדשה. הוא יכול להגדיר כמה עמודות בקריאה אחת, ועמודות מאוחרות יכולות להשתמש בעמודות מוקדמות שהוגדרו באותו mutate.
איך מוחקים עמודה מ-data frame ב-R?
הציבו בה NULL: df$notes <- NULL מסיר את העמודה במקום. ב-dplyr, select(-notes) מחזיר עותק בלעדיה.