Menu

הוספה ושינוי של עמודות ב-R (mutate ו-R בסיסי)

איך מוסיפים, משנים ומסירים עמודות ב-data frame: df$new <- ..., ifelse() לעמודות מותנות, transform(), ו-mutate() של dplyr עם case_when().

בדף הזה יש עורכים שאפשר להריץ - לערוך, להריץ ולראות את הפלט מיד.

הוספת עמודה: 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) מחזיר עותק בלעדיה.

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל