Menu

Data Frames ב-R: יצירה, בדיקה וגישה לעמודות

ה-data frame הוא הגיליון האלקטרוני של R: עמודות עם שמות ובאורך שווה, לכל אחת סוג משלה. איך בונים אחד, בוחנים אותו עם str() ו-head(), ומגיעים לעמודות, לשורות ולתאים.

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

Data frame הוא רשימה של עמודות

Data frame הוא הטבלה של R: שורות של תצפיות, עמודות של משתנים. זה הגיליון האלקטרוני של R, והצורה שבה מגיעים כמעט כל הנתונים האמיתיים: שורה אחת לכל אדם, לכל מדידה, לכל עסקה; עמודה אחת לכל תכונה.

מבחינה מבנית, data frame הוא רשימה של וקטורים באורך שווה, עם התנהגות של שורות ועמודות מעליה. העובדה האחת הזו מסבירה את רוב הכללים שלו: לכל עמודה יש סוג אחד (היא וקטור), לעמודות שונות יכולים להיות סוגים שונים (זו רשימה), וכל העמודות חייבות להיות באותו אורך (זה החלק של ה-"frame").

בונים אחד על ידי העברת וקטורים עם שמות ל-data.frame():

טקסט, מספרים וערכים לוגיים חיים זה לצד זה, תמהיל שמטריצה לא יכולה להכיל. בפועל כמעט לא תקלידו נתונים ידנית כך; טבלאות מגיעות בדרך כלל דרך read.csv או ממסד נתונים. אבל כל מה שבהמשך חל באותה צורה בדיוק, לא משנה מאיפה הגיע ה-data frame.

להכיר את ה-data frame

אל תחשבו אף פעם על מערך נתונים שלא הסתכלתם עליו. ארגז הכלים של R לבדיקה קצר, ושווה להפוך אותו לרפלקס:

  • str() היא הפונקציה שמריצים ראשונה על כל נתונים שזה עתה נטענו: שורה אחת לכל עמודה עם הסוג שלה והערכים הראשונים. כאן תתפסו את עמודת ה"מספרים" שבפועל נקראה כתווים בגלל ערך תועה אחד.
  • nrow() / ncol() נותנות את הממדים; names() מציגה את שמות העמודות.
  • summary() נותנת סטטיסטיקה לכל עמודה: מינימום, חציון, ממוצע ומקסימום למספרים, ספירות לערכים לוגיים ול-factors.
  • head(df) ו-tail(df) מדפיסות את שש השורות הראשונות והאחרונות, הכרחיות כשמערכי נתונים אמיתיים גדולים מכדי להדפיס אותם במלואם. תראו את head() בפעולה בהמשך על מערך נתונים מובנה.

שלוש דרכים לקבל עמודה

גישה לעמודה היא הפעולה הבסיסית ביותר, ו-R נותנת לכם שלושה כתיבים:

  • people$age: הצורה היומיומית: קצרה, קריאה, ומשלימה אוטומטית ברוב העורכים.
  • people[["age"]]: תוצאה זהה, אבל השם יכול להגיע ממשתנה (col <- "age"; people[[col]]), מה ש-$ לא יכול לעשות. העדיפו אותה בתוך פונקציות.
  • people[, "age"]: בסגנון מטריצה: שורות לפני הפסיק (ריק = כולן), עמודות אחריו.

שלושתן מחזירות את העמודה כוקטור רגיל, מוכן ל-mean(people$age). הכתיב הרביעי בקטע הקוד הוא המלכודת: people["age"] עם סוגריים בודדים מחזיר data frame בעל עמודה אחת, לא וקטור. זו אותה הבחנה בין [ ל-[[ שיש ברשימות, כי data frame הוא רשימה. אם פונקציה מתמטית מתלוננת שהקלט שלכם אינו מספרי, בדקו את הסוגריים.

שורות ותאים

הכתיב [row, column] מגיע לכל חתך של הטבלה:

people[2, ] היא כל השורה השנייה (כ-data frame בעל שורה אחת: שורות שומרות על המסגרת שלהן, כי הן מערבבות סוגים). people[2, "name"] הוא תא בודד. וקטור של מספרי שורות שולף כמה שורות.

השורה האחרונה היא החשובה: תנאי לוגי על עמודה בוחר שורות, כאן כל מי שמעל גיל 28. הדפוס הזה של מסכה על השורות הוא הבסיס לכל סינון נתונים ב-R, ומגיע לו מאמר משלו: ראו filter and subset להסבר המלא, כולל subset() וסינונים עם כמה תנאים.

הוספה והסרה של עמודות

מכיוון ש-data frame הוא רשימה של עמודות, עמודות נוספות ונעלמות בעזרת השמה פשוטה:

השמה לשם חדש מוסיפה את העמודה; הווקטור חייב להתאים ל-nrow() (או להיות באורך 1, ואז הוא ממוחזר כדי למלא כל שורה). התוספת השנייה מראה את המהלך המקובל: עמודות חדשות שמחושבות מעמודות קיימות, בעזרת חישוב וקטורי על כל העמודה בבת אחת. השמה של NULL מוחקת עמודה לגמרי.

אפשר לדרוס ערכי עמודה באותה צורה: people$age <- people$age + 1 מוסיף שנה לגיל של כולם.

מערכי נתונים מובנים, ומילה על tibbles

R מגיעה עם מערכי נתונים לתרגול שכבר טעונים, כך שאפשר לנסות את כל מה שלמעלה בלי לייבא שום דבר. השניים שתפגשו בכל מדריך הם mtcars (32 מכוניות, 11 משתנים מספריים) ו-iris (150 פרחים, 4 מדידות ועוד factor של המין):

head() מצדיקה את קיומה: שש שורות מספרות לכם את צורת הנתונים בלי להציף את המסך. מערכי הנתונים האלה הם מגרשי משחקים אידיאליים: כשאתם לא בטוחים איך פונקציה מסוימת מתנהגת, בדקו אותה על mtcars לפני שאתם מפעילים אותה על הנתונים שלכם.

מונח אחד שתפגשו ברגע שתיגעו ב-tidyverse: ה-tibble, הגרסה של ה-tidyverse ל-data frame. אותו רעיון, התנהגות מנומסת יותר: ההדפסה מציגה רק את עשר השורות הראשונות עם סוגי העמודות, ואין התאמה חלקית של שמות. נוצר עם tibble() או מוחזר מפונקציות של readr/dplyr:

library(tibble)
tibble(name = c("Rosa", "Ken"), age = c(30, 41))
#> # A tibble: 2 x 2
#>   name    age
#>   <chr> <dbl>
#> 1 Rosa     30
#> 2 Ken      41

כל מה שבמאמר הזה, $, str(), הוספת עמודות, מסכות לוגיות על שורות, עובד על tibbles בלי שינוי. Tibble הוא data frame עם ליטוש נוסף; למדתם data frames, למדתם את שניהם.

מה לקחת מכאן

  • Data frame הוא רשימה של עמודות באורך שווה: סוג אחד לכל עמודה, סוגים מעורבים בטבלה כולה. הגיליון האלקטרוני של R.
  • בדקו לפני שאתם מחשבים: קודם str(), אחר כך head(), summary(), nrow()/ncol()/names().
  • df$col, df[["col"]] ו-df[, "col"] כולן מחזירות עמודה כווקטור; סוגריים בודדים df["col"] מחזירים data frame.
  • df[rows, cols] חותך כל דבר; מסכה לוגית לפני הפסיק מסננת שורות.
  • הוסיפו עמודות בהשמה (לרוב מחושבות מעמודות אחרות); הסירו עם NULL; תרגלו על mtcars.

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

שאלות נפוצות

איך יוצרים data frame ב-R?

מעבירים ל-data.frame() וקטורים עם שמות ובאורך שווה: df <- data.frame(name = c("Rosa", "Ken"), age = c(30, 41)). כל וקטור הופך לעמודה. בפועל רוב ה-data frames לא מוקלדים ידנית: הם מגיעים מ-read.csv() או ממסד נתונים, אבל המבנה זהה.

איך ניגשים לעמודה ב-data frame של R?

בשלוש דרכים: df$age (מהירה וקריאה), df[["age"]] (אותה תוצאה, ועובדת כששם העמודה שמור במשתנה) ו-df[, "age"] (בסגנון מטריצה). שלושתן מחזירות את העמודה כווקטור רגיל. df["age"] עם סוגריים בודדים מחזיר במקום זאת data frame בעל עמודה אחת, מקור נפוץ לבלבול.

מה str() מציגה עבור data frame?

שורה אחת לכל עמודה: השם שלה, הסוג שלה והערכים הראשונים, ובראש מספר השורות והעמודות. זו הדרך המהירה ביותר לראות אם עמודה נקראה כמספרית או כטקסט, ולכן str() צריכה להיות הדבר הראשון שאתם מריצים על כל מערך נתונים שזה עתה נטען.

איך מוסיפים עמודה ל-data frame ב-R?

מבצעים השמה לשם שעדיין לא קיים: df$score <- c(88, 75, 93). הווקטור חייב להתאים למספר השורות (או להיות באורך 1, ואז הוא ממוחזר לכל שורה). מסירים עמודה על ידי השמה של NULL: df$score <- NULL.

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

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

להתחיל