הדרכה R: כיצד לייבא נתונים ל- R.

קבל את הספר השלם
R מעשי לתקשורת המונית ועיתונאות MSRP $ 59.95 ראה זאת

מאמר זה הוצא מתוך "R מעשי לתקשורת המונית ועיתונאות" באישור המו"ל. © 2019 על ידי קבוצת טיילור ופרנסיס, LLC.

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

בדרך כלל, הפונקציה בה אתה משתמש לייבוא ​​נתונים תלויה בפורמט הקובץ של הנתונים. בבסיס R, למשל, אתה יכול לייבא קובץ CSV באמצעותו read.csv(). הדלי וויקהאם יצרה חבילה בשם readxl, שכפי שניתן היה לצפות, יש לה פונקציה לקרוא בקבצי Excel. יש חבילה נוספת, גיליונות Google, לשליפת נתונים מגיליונות אלקטרוניים של גוגל.

אבל אם אתה לא רוצה לזכור את כל זה, יש ריו.

הקסם של ריו

"המטרה של rio היא להפוך את קובץ הנתונים / פלט [יבוא / פלט] ב- R לקל ככל האפשר על ידי הטמעת שלוש פונקציות פשוטות בסגנון סכינים של הצבא השוויצרי", על פי דף GitHub של הפרויקט. פונקציות אלה import(), export(), ו convert().

אז, את החבילה לריו יש רק אחד פונקציה לקרוא סוגים רבים ושונים של קבצים: import(). אם אתה import("myfile.csv")יודע להשתמש בפונקציה כדי לקרוא קובץ CSV. import("myspreadsheet.xlsx")עובד באותה צורה. למעשה, Rio מטפל ביותר משני תריסר פורמטים כולל נתונים המופרדים באמצעות כרטיסיות (עם הסיומת .tsv), JSON, Stata ונתוני פורמט רוחב קבוע (.fwf).

חבילות הדרושות להדרכה זו

  • ריו
  • htmltab
  • readxl
  • גליונות Google
  • פקמן
  • שָׁרָת
  • rmiscutils (pm GitHub) או readr
  • לנגוס

לאחר שניתחת את הנתונים שלך, אם ברצונך לשמור את התוצאות כ- CSV, גיליון אלקטרוני של Excel או כפורמטים אחרים, export()הפונקציה של rio יכולה להתמודד עם זה.

אם עדיין אין לך את חבילת rio במערכת שלך, התקן אותה עכשיו עם install.packages("rio").

הגדרתי כמה נתוני דוגמה עם נתוני שלג החורף בבוסטון. תוכל לעבור אל //bit.ly/BostonSnowfallCSV ולחץ באמצעות לחצן העכבר הימני כדי לשמור את הקובץ כ- BostonWinterSnowfalls.csv בספריית העבודה הנוכחית שלך בפרויקט R. אך אחת מנקודות התסריט היא להחליף עבודה ידנית - מייגעת או אחרת - באוטומציה שקל לשחזר. במקום ללחוץ על ההורדה, אתה יכול להשתמש download.fileבפונקציה של R עם התחביר download.file("url", "destinationFileName.csv"):

download.file ("// bit.ly/BostonSnowfallCSV", "BostonWinterSnowfalls.csv")

זה מניח שהמערכת שלך תנתב מחדש מאותו קיצור דרך של כתובת ה- Bit.ly ותמצא בהצלחה את כתובת ה- URL של הקובץ האמיתי, //raw.githubusercontent.com/smach/NICAR15data/master/BostonWinterSnowfalls.csv. מדי פעם נתקלתי בבעיות בגישה לתוכן אינטרנט במחשבי Windows ישנים. אם יש לך אחד מאלה וקישור Bit.ly זה לא עובד, תוכל להחליף את כתובת ה- URL בפועל לקישור Bit.ly. אפשרות נוספת היא שדרוג מחשב Windows ל- Windows 10 אם אפשר לבדוק אם זה עושה את הטריק.

אם אתה רוצה ש- Rio יכול פשוט לייבא נתונים ישירות מכתובת אתר, למעשה זה יכול, ואגיע לזה בחלק הבא. העניין של סעיף זה הוא להתאמן בעבודה עם קובץ מקומי.

ברגע שיש לך את קובץ הבדיקה במערכת המקומית שלך, אתה יכול לטעון את הנתונים לאובייקט R שנקרא snowdata עם הקוד:

נתוני שלג <- rio :: import ("BostonWinterSnowfalls.csv")

שים לב כי יתכן ש- rio יבקש ממך להוריד מחדש את הקובץ בפורמט בינארי, ובמקרה זה תצטרך להריץ

download.file ("// bit.ly/BostonSnowfallCSV", "BostonWinterSnowfalls.csv", mode = "wb")

הקפד להשתמש באפשרויות השלמת הכרטיסיות של RStudio. אם תקליד rio::ותמתין, תקבל רשימה של כל הפונקציות הזמינות. הקלד snowוהמתן, ואתה אמור לראות את השם המלא של האובייקט שלך כאופציה. השתמש במקשי החצים למעלה ולמטה כדי לעבור בין הצעות להשלמה אוטומטית. לאחר שהאפשרות הרצויה מודגשת, לחץ על מקש Tab (או Enter) כדי להוסיף את האובייקט המלא או שם הפונקציה לסקריפט שלך.

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

קבוצת טיילור ופרנסיס

snowdataצריך להראות שיש בו 76 "אובססיביות" - תצפיות, או שורות - ושני משתנים, או עמודות. אם תלחץ על החץ משמאל snowdataלהרחבת הרישום, תראה את שני שמות העמודות וסוג הנתונים שכל עמודה מחזיקה. Winterהוא מחרוזות תווים ואת Totalהטור הוא מספרי. אתה אמור להיות מסוגל לראות את הערכים הראשונים של כל עמודה בחלונית הסביבה.

קבוצת טיילור ופרנסיס

לחץ על המילה snowdataעצמה בכרטיסייה סביבה לקבלת תצוגה דמוית גיליון אלקטרוני יותר של הנתונים שלך. אתה יכול לקבל את אותה תצוגה מקונסולת R באמצעות הפקודה View(snowdata)(זה חייב להיות V באותיות ראשיות - viewלא יעבוד). הערה: snowdataאינו במרכאות כיוון שאתה מתייחס לשם של אובייקט R בסביבתך. בשנות ה rio::importהפקודה לפני, BostonWinterSnowfalls.csv הוא במרכאות כי זה לא חפץ R; זהו שם מחרוזת תווים של קובץ מחוץ ל- R.

קבוצת טיילור ופרנסיס

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

אם תלחץ על סמל המסנן, תקבל מסנן לכל עמודה. Winterטור אופי עובד כפי שהיה אפשר לצפות, סינון עבור כל השורות המכילות את התווים שאתה מקליד. אם תלחץ על Totalהמסנן של עמודה מספרית, אם כי, גרסאות ישנות יותר של rstudio להראות המחוון בעוד אלה החדשים מראים היסטוגרמה ותיבת סינון .

ייבא קובץ מהאינטרנט

אם אתה רוצה להוריד ולייבא קובץ מהאינטרנט, אתה יכול לעשות זאת אם הוא זמין לציבור ובפורמט כגון Excel או CSV. לְנַסוֹת

נתוני שלג <- rio :: import ("// bit.ly/BostonSnowfallCSV", פורמט)

הרבה מערכות יכולות לעקוב אחר כתובת האתר להפניה מחדש לקובץ גם לאחר שמסרת לך לראשונה הודעת שגיאה, כל עוד אתה מציין את הפורמט מכיוון "csv"ששם הקובץ כאן אינו כולל .csv. אם שלך לא יעבוד, השתמש במקום זאת בכתובת URL //raw.githubusercontent.com/smach/R4JournalismBook/master/data/BostonSnowfall.csv.

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

rsi_description <- rio :: import ("//www.ncdc.noaa.gov/snow-and-ice/rsi/", format = "html")

שים לב שוב שעליך לכלול את הפורמט, במקרה זה format="html". מכיוון שכתובת האתר עצמה אינה נותנת כל אינדיקציה לגבי סוג הקובץ. אם כתובת האתר כללה שם קובץ עם .htmlסיומת, Rio היה יודע.

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

ספרית (htmltab) שולחן עירוני <- htmltab ("// en.wikipedia.org/wiki/List_of_United_States_cities_by_population") str (שולחן עירוני)

אתה רואה שאין לך את הטבלה הנכונה, כי מסגרת הנתונים מכילה אובייקט אחד. מכיוון שלא ציינתי איזו טבלה היא משכה את טבלת ה- HTML הראשונה בדף. זה לא היה זה שאני רוצה. לא מתחשק לי לייבא כל טבלה בדף עד שאמצא את השורה הנכונה, אך למרבה המזל יש לי סיומת כרום בשם Table Capture המאפשרת לי להציג רשימה של הטבלאות בעמוד.

בפעם האחרונה שבדקתי, טבלה 5 עם יותר מ -300 שורות הייתה זו שרציתי. אם זה לא עובד בשבילך עכשיו, נסה להתקין לכידת טבלה בדפדפן Chrome כדי לבדוק איזו טבלה אתה רוצה להוריד.

אנסה שוב, לציין טבלה 5 ואז לראות מהם שמות העמודות בשולחן העיר החדש. שים לב שבקוד הבא הנחתי את citytable <- htmltab()הפקודה על מספר שורות. זה כדי שזה לא עבר את השוליים - אתה יכול לשמור הכל על שורה אחת. אם מספר הטבלה השתנה מאז פרסום מאמר זה, החלף which = 5במספר הנכון.

במקום להשתמש בדף בוויקיפדיה, אתה יכול להחליף את כתובת האתר של ויקיפדיה בכתובת האתר של עותק של הקובץ שיצרתי. הקובץ נמצא בכתובת //bit.ly/WikiCityList. כדי להשתמש בגרסה זו סוג bit.ly/WikiCityListלתוך הדפדפן, ולאחר מכן להעתיק את כתובת האתר ארוכה זה מפנה ושימוש כי במקום בכתובת וויקיפדיה הקוד שלהלן:

ספריית (htmltab) שולחן עירוני <- htmltab ("// en.wikipedia.org/wiki/List_of_United_States_cities_by_population", אשר = 5) שמות עמודים (שולחן עיר)

איך ידעתי whichשהוא הטיעון שאני צריך כדי לציין את מספר הטבלה? קראתי את htmltabקובץ העזרה באמצעות הפקודה ?htmltab. זה כלל את כל הוויכוחים הזמינים. סרקתי את האפשרויות, whichו"ווקטור באורך אחד לזיהוי הטבלה במסמך "נראה נכון.

שים לב גם שהשתמשתי colnames(citytable)במקום names(citytable)לראות את שמות העמודות. כל אחד מהם יעבוד. לבסיס R יש גם את  rownames()הפונקציה.

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

זהו אחד המטרדים הקטנים של R: R בדרך כלל לא מבין שזה 8,550מספר. טיפלתי בעצמי בבעיה זו על ידי כתיבת הפונקציה שלי בחבילה rmiscutils משלי כדי להפוך את כל אותם "מחרוזות תווים" שהם באמת מספרים עם פסיקים למספרים. כל אחד יכול להוריד את החבילה מ- GitHub ולהשתמש בה.

הדרך הפופולרית ביותר להתקין חבילות מ- GitHub היא להשתמש בחבילה הנקראת devtools. devtools היא חבילה חזקה במיוחד המיועדת בעיקר לאנשים שרוצים לכתוב חבילות משלהם , והיא כוללת כמה דרכים להתקין חבילות ממקומות אחרים מלבד CRAN. עם זאת, devtools בדרך כלל דורשים כמה צעדים נוספים להתקנה בהשוואה לחבילה טיפוסית, ואני רוצה להשאיר משימות מעצבנות של מערכת מערכת עד הצורך המוחלט.

עם זאת, חבילת ה- pacman מתקינה גם חבילות ממקורות שאינם CRAN כמו GitHub. אם עדיין לא, התקן את pacman עםinstall.packages("pacman").

p_install_gh("username/packagerepo")הפונקציה של pacman מותקנת מתוך ריפו של GitHub.

p_load_gh("username/packagerepo")טוען חבילה לזיכרון אם היא כבר קיימת במערכת שלך, והיא מתקינה תחילה ואז טוענת חבילה מ- GitHub אם החבילה אינה קיימת באופן מקומי.

ניתן למצוא את חבילת כלי השירות של rmisc בכתובת smach/rmiscutils. הפעל pacman::p_load_gh("smach/rmiscutils")להתקנת חבילת rmiscutils שלי.

הערה: חבילה חלופית להתקנת חבילות מ- GitHub נקראת שלטים, שאותם תוכלו להתקין באמצעות  install.packages("remotes"). מטרתו העיקרית היא להתקין חבילות ממאגרים מרוחקים כמו GitHub. אתה יכול להסתכל על קובץ העזרה עם help(package="remotes").

ואולי החלקלק מכולם הוא חבילה בשם githubinstall. מטרתו היא לנחש את רפו היכן חבילה שוכנת. התקן אותו באמצעות  install.packages("githubinstall"); ואז אתה יכול להתקין את חבילת rmiscutils שלי באמצעות  githubinstall::gh_install_packages("rmiscutils"). אתה נשאל אם אתה רוצה להתקין את החבילה ב- smach/rmisutils(אתה כן).

עכשיו שהתקנת את אוסף הפונקציות שלי, אתה יכול להשתמש number_with_commas()בפונקציה שלי כדי לשנות את מחרוזות התווים שאמורות להיות מספרים חזרה למספרים. אני ממליץ בחום להוסיף עמודה חדשה למסגרת הנתונים במקום לשנות עמודה קיימת - זה נוהג טוב לניתוח נתונים ולא משנה באיזו פלטפורמה אתה משתמש.

בדוגמה זו אקרא לעמודה החדשה PopEst2017. (אם הטבלה עודכנה מאז, השתמש בשמות עמודות מתאימים.)

ספרייה (rmiscutils) שולחן עירוני $ PopEst2017 <- number_with_commas (שולחן עירוני $ `אומדן 2017 ')

חבילת ה- rmiscutils שלי היא לא הדרך היחידה להתמודד עם מספרים מיובאים שיש להם פסיקים, אגב. לאחר שיצרתי את חבילת ה- rmiscutils שלי ותפקידה, נולדה חבילת number_with_commas()ה- readr המסודרת. readr כולל גם פונקציה שהופכת מחרוזות תווים למספרים parse_number(),.

לאחר התקנת readr, תוכל ליצור מספרים מעמודת האומדן לשנת 2017 עם readr:

שולחן עירוני $ PopEst2017 <- readr :: parse_number (שולחן עירוני $ `אומדן 2017 ')

יתרון אחד readr::parse_number()הוא שאתה יכול להגדיר בעצמך locale()כדי לשלוט בדברים כמו קידוד וסימנים עשרוניים, שעשויים לעניין את הקוראים שאינם בארה"ב. הפעל ?parse_number למידע נוסף.

הערה: אם לא השתמשת בהשלמת הכרטיסיות בעמודה אומדן לשנת 2017, ייתכן שיש לך בעיה בשם העמודה הזה אם יש בו רווח בזמן שאתה מריץ קוד זה. בקוד שלי למעלה, שים לב שיש סימני מרכאות אחוריים אחוריים ( `) סביב שם העמודה. הסיבה לכך היא שלשם הקיים היה רווח, שאינך אמור להיות ב- R. לשם העמודה יש ​​בעיה אחרת: זה מתחיל במספר, ובדרך כלל גם R no-no. RStudio יודע זאת ומוסיף באופן אוטומטי את הציטוטים האחוריים הדרושים סביב השם עם השלמה אוטומטית של הכרטיסיות.

טיפ בונוס: יש חבילת R (כמובן שיש!) הנקראת שוער שיכול לתקן באופן אוטומטי שמות עמודות מטרידים המיובאים ממקור נתונים שאינו ידידותי ל- R. התקן אותו עם install.packages("janitor"). לאחר מכן תוכל ליצור שמות עמודות נקיים חדשים באמצעות clean_names()פונקציית השרת .

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

Citytable_cleaned <- שוער :: clean_names (citytable)

שמות (טבלה עירונית)

אתה רואה שהמרווחים שונו לקו תחתון, שהם חוקיים בשמות משתנים R (כמו גם תקופות). כמו כן, כל שמות העמודות שהתחילו עם מספר יש כעת xבהתחלה.

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

ייבא נתונים מחבילות

ישנן מספר חבילות המאפשרות לך לגשת לנתונים ישירות מ- R. One הוא quantmod, המאפשר לך למשוך כמה נתונים ממשלתיים ופיננסיים ישירות אל R.

אחרת היא חבילת נתוני מזג האוויר הנקראת כראוי ב- CRAN. זה יכול לשלוף נתונים מממשק ה- API של Weather Underground, שיש בו מידע עבור מדינות רבות ברחבי העולם. 

חבילת rnoaa, פרויקט מקבוצת rOpenSci, מתמקדת בכמה קבוצות נתונים שונות של הממשל הלאומי לאוקיאנוס ואווירה, כולל מידע על אקלים יומי, מצוף וסערה.

אם אתה מעוניין בנתונים ממשלתיים או ממשלתיים מקומיים בארה"ב או בקנדה, ייתכן שתרצה לבדוק את RSocrata כדי לראות אם סוכנות שאתה מעוניין לפרסם שם נתונים. טרם מצאתי רשימה מלאה של כל מערכי הנתונים הזמינים של סוקרטה, אך יש דף חיפוש בכתובת //www.opendatanetwork.com. היזהר, עם זאת: יש קבוצות שהועלו על ידי הקהילה יחד עם נתונים ממשלתיים רשמיים, אז בדוק את הבעלים של מערך הנתונים והעלה את המקור לפני שתסתמך עליו על יותר מ- R. "ערכת נתונים ODN" בתוצאה פירושה שזה קובץ שהועלה על ידי מישהו בציבור הרחב. מערכי הנתונים הרשמיים של הממשלה נוטים לחיות בכתובות אתרים כמו //data.CityOrStateName.govו  //data.CityOrStateName.us.

לקבלת חבילות נוספות לייבוא ​​נתונים, עיין בתרשים הניתן לחיפוש שלי בכתובת //bit.ly/RDataPkgs. אם אתה עובד עם נתוני ממשלת ארה"ב, יתכן ותהיה מעוניין במיוחד במפקד האוכלוסין ובמפקד הגידול, שניהם משתמשים בנתוני מפקד האוכלוסין בארה"ב. חבילות נתונים שימושיות אחרות של הממשלה כוללות eu.us.opendata מממשלות ארה"ב והאיחוד האירופי כדי להקל על השוואת הנתונים בשני האזורים, וכן על מנת לבחון נתונים על מפקד האוכלוסין הקנדי.

כאשר הנתונים אינם מעוצבים באופן אידיאלי

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

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

שורות מתחילות שאינן חלק מהנתונים. אם אתה יודע שבשורות הראשונות של גיליון אלקטרוני של Excel אין נתונים שאתה רוצה, אתה יכול להורות ל- rio לדלג על שורה אחת או יותר. התחביר הוא rio::import("mySpreadsheet.xlsx", skip=3)לא לכלול את שלוש השורות הראשונות. skipלוקח מספר שלם.

אין שמות עמודות בגיליון האלקטרוני. ייבוא ​​ברירת המחדל מניח שהשורה הראשונה בגיליון שלך היא שמות העמודות. אם לנתונים שלך אין כותרות, השורה הראשונה של הנתונים שלך עשויה להסתיים ככותרות העמודות שלך. כדי להימנע מכך, השתמש בכדי ש- rio::import("mySpreadsheet.xlsx", col_names = FALSE)R ייצור כותרות ברירת מחדל של X0, X1, X2 וכן הלאה. לחלופין, השתמש בתחביר כגון rio::import("mySpreadsheet.xlsx", col_names = c("City", "State", "Population"))להגדרת שמות עמודות משלך.

אם יש מספר כרטיסיות בגיליון האלקטרוני שלך, whichהטיעון עוקף את ברירת המחדל לקריאה בגליון העבודה הראשון. rio::import("mySpreadsheet.xlsx", which = 2)קורא בגליון העבודה השני.

מהי מסגרת נתונים? ומה אפשר לעשות עם אחד?

היבוא ריו אלקטרוני או מקובץ CSV כקובץ R מסגרת נתונים . איך אתה יודע אם יש לך מסגרת נתונים? במקרה של snowdata, class(snowdata)מחזיר את המחלקה או סוג האובייקט שהוא. str(snowdata)גם אומר לך את הכיתה ומוסיף קצת יותר מידע. חלק ניכר מהמידע שאתה רואה איתו str()דומה למה שראית לדוגמא זו בחלונית הסביבה RStudio: snowdataכולל 76 תצפיות (שורות) ושני משתנים (עמודות).

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

אם יש לך עמודת מסגרת נתונים עם הערכים 5, 7, 4 ו"ערך לבוא ", R לא פשוט יהיה אומלל וייתן לך שגיאה. במקום זאת, זה יאלץ את כל הערכים שלך להיות מאותו סוג נתונים. בגלל "ערך לבוא" לא ניתן להפוך מספר, 5, 7, ו 4 יהיה בסופו של דבר הפכו להיות מחרוזות תווים של "5", "7", ו "4". זה בדרך כלל לא מה שאתה רוצה, לכן חשוב להיות מודע לסוג הנתונים בכל עמודה. ערך מחרוזת תווים אחד תועה בעמודה של 1,000 מספרים יכול להפוך את כל העניין לדמויות. אם אתה רוצה מספרים, ודא שיש לך אותם!

ל- R יש דרכים להתייחס לנתונים חסרים שלא יתברגו בשאר העמודות שלך: NAפירושם "לא זמין".

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

לעמודות של גיליונות אלקטרוניים של Excel מתייחסים בדרך כלל באותיות: עמודה A, עמודה B וכו '. אתה יכול להתייחס לעמודה למסגרת נתונים עם השם שלה באמצעות התחביר dataFrameName$columnName. לכן, אם אתה מקליד snowdata$Totalולחץ על Enter, אתה רואה את כל הערכים Totalבעמודה, כפי שמוצג באיור למטה. (לכן כשאתה מריץ את str(snowdata)הפקודה, יש סימן דולר לפני השם של כל עמודה.)

קבוצת טיילור ופרנסיס

תזכורת לכך שהמספרים בסוגריים משמאל לרישום אינם חלק מהנתונים; הם רק אומרים לך באיזו עמדה כל שורה של נתונים מתחילה. [1]פירושו ששורה מתחילה בפריט הראשון בווקטור, [10]בעשירית וכו '.

השלמת כרטיסיית RStudio עובדת עם שמות עמודות של מסגרות נתונים כמו גם שמות עצמים ופונקציות. זה די שימושי כדי לוודא שלא מאייתים שגוי שם עמודה ושוברים את הסקריפט שלך - וזה גם שומר הקלדה אם יש לך שמות עמודות ארוכים.

הקלד snowdata$והמתן ואז תראה רשימה של כל שמות העמודות בנתוני השלג.

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

נתונים שלג $ מטר <- נתוני שלג $ סה"כ * 0.0254

שם העמודה החדשה נמצא משמאל ויש נוסחה מימין. ב- Excel, ייתכן שהשתמשת =A2 * 0.0254והעתקת את הנוסחה למטה בעמודה. עם סקריפט, אינך צריך לדאוג אם החלת את הנוסחה כהלכה על כל הערכים בעמודה.

כעת הסתכל על snowdataהאובייקט שלך בכרטיסיה סביבה. עליו להיות משתנה שלישי Meters,.

מכיוון snowdataשהיא מסגרת נתונים, יש לה מאפייני מסגרת נתונים מסוימים אליהם אתה יכול לגשת משורת הפקודה. nrow(snowdata) נותן לך את מספר השורות ואת ncol(snowdata)מספר העמודות. כן, אתה יכול לראות זאת בסביבת RStudio כדי לראות כמה תצפיות ומשתנים יש, אך כנראה יהיו מקרים שתרצה לדעת זאת כחלק מתסריט. colnames(snowdata)או names(snowdata) נותן לך את שם snowdataהעמודות. rownames(snowdata) תן לך שמות שורה כלשהם (אם לא הוגדרו שם, ברירת המחדל היא מחרוזות תווים של מספר השורה כגון "1", "2", "3",וכו ').

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

שמות (נתוני שלג) <- c ("Winter", "SnowInches", "SnowMeters")

משנה את שמות העמודות במסגרת הנתונים.

כנראה שלא תצטרך לדעת את כל השיטות הזמינות עבור אובייקט מסגרת נתונים, אך אם אתה סקרן, methods(class=class(snowdata)) מציג אותן. למידע נוסף על כל שיטה, הפעל את שאילתת העזרה הרגילה עם סימן שאלה, כגון ?mergeאו ?subset.

כשמספר לא באמת מספר

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

יש לי קובץ של מיקומי בוסטון המפורטים בכרטיסייה לפי שכונה, שהורד מסוכנות ממשלתית במסצ'וסטס בכתובת //raw.githubusercontent.com/smach/R4JournalismBook/master/data/bostonzips.txt. אם הייתי מנסה לייבא אותו איתו zips <- rio::import("bostonzips.txt"), המיקודים היו נכנסים 2118, 2119 וכו 'ולא 02118, 02119, וכן הלאה.

זה המקום שבו זה עוזר לדעת מעט על הפונקציה הבסיסית בה import()משתמשת הפונקציה של ריו . תוכל למצוא את הפונקציות הבסיסיות האלה על ידי קריאת importקובץ העזרה בכתובת ?import. לצורך משיכת קבצים המופרדים באמצעות כרטיסיות, importמשתמש fread()מחבילת data.table או read.table()מהפונקציה של בסיס R. ?read.tableהעזרה אומרת שניתן לציין כיתות עמודה עם colClassesהטיעון.

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

download.file ("// raw.githubusercontent.com/smach/R4JournalismBook/master/data/bostonzips.txt", "data / bostonzips.txt")

אם אתה מייבא קובץ זה שמציין את שתי העמודות כמחרוזות תווים, המיקודים יגיעו בצורה נכונה:

רוכסנים <- rio :: import ("data / bostonzips.txt", colClasses = c ("character" "," character ")) str (zip)

שים לב שיש להגדיר את מחלקות העמודות באמצעות c()הפונקציה c("character", "character"),. אם ניסיתם colClasses, "character", תקבלו הודעת שגיאה. זוהי שגיאה אופיינית למתחילים ב- R, אך לא אמור לקחת זמן רב c()להרגיל.

טיפ חסוך לעצמך-כמה-הקלדה: כתיבה c("character", "character")היא לא כל כך מפרכת; אבל אם יש לך גיליון אלקטרוני עם 16 עמודות שבו 14 הראשונים צריכים להיות מחרוזות תווים, זה יכול להיות מעצבן. rep()הפונקציה של R יכולה לעזור. rep(), כפי שאולי ניחשתם, חוזר על כל פריט שתעניקו לו עם זאת פעמים רבות שתספרו לו, תוך שימוש בפורמט rep(myitem, numtimes). rep("character", 2)זהה ל- c("character", "character"), כך colClasses = rep("character", 2)שווה ערך ל- colClasses = c("character", "character"). וגם, colClasses = c(rep("character", 14), rep("numeric", 2)) קובע את 14 העמודים הראשונים כמו מחרוזות תווים ושני האחרונים כמספרים. כל השמות של מחלקות העמודות כאן צריכים להיות במרכאות מכיוון ששמות הם מחרוזות תווים.

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

נתוני מדגם קלים

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

הקלד data()כדי לראות ערכות נתונים מובנות זמינות בבסיס R וכל החבילות המותקנות נטענות כרגע. data(package = .packages(all.available = TRUE))מבסיס R מציג את כל ערכות הנתונים האפשריות מחבילות המותקנות במערכת שלך, בין אם הן נטענות בזיכרון ובין אם לא בפגישת העבודה הנוכחית שלך.

אתה יכול לקבל מידע נוסף על מערך נתונים באותה הדרך בה אתה מקבל עזרה בפונקציות: ?datasetnameאו help("datasetname"). mtcars ואיריס הם בין אלה שראיתי בשימוש לעתים קרובות מאוד.

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

אתה יכול לאחסן את ערכת הנתונים במשתנה אחר אם תרצה, בפורמט כמו cardata <- mtcars.

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

אחת החבילות המעניינות ביותר עם ערכות נתונים לדוגמה לעיתונאים היא חבילת fivethirtyeight, הכוללת נתונים מסיפורים שפורסמו באתר FiveThirtyEight.com. החבילה נוצרה על ידי כמה אנשי אקדמיה בהתייעצות עם עורכי FiveThirtyEight; הוא נועד להיות משאב להוראת סטטיסטיקה לתואר ראשון.

נתונים ארוזים מראש יכולים להיות שימושיים - ובמקרים מסוימים כיף. בעולם האמיתי, עם זאת, יתכן שאתה לא משתמש בנתונים שנארזים בצורה כה נוחה.

צור מסגרת נתונים באופן ידני ב- R

רוב הסיכויים הם שלעתים קרובות תעסוק בנתונים שמתחילים מחוץ ל- R ואתה מייבא מגיליון אלקטרוני, קובץ CSV, API או מקור אחר. אבל לפעמים אולי רק תרצה להקליד כמות קטנה של נתונים ישירות ל- R, או אחרת ליצור מסגרת נתונים באופן ידני. אז בואו נסתכל במהירות על איך זה עובד.

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

מועמדים <- ג ("סמית", "ג'ונס", "כתובות", "ריקים")

מפלגה <- ג ("דמוקרט", "רפובליקני", "", "")

הצבעות <- ג (15248, 16723, 230, 5234)

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

כדי ליצור מסגרת נתונים מאותן עמודות, השתמש data.frame()בפונקציה וב- synatx data.frame(column1, column2, column3).

myresults <- data.frame (מועמדים, מפלגה, קולות)

בדוק את מבנהו באמצעות str():

str(myresults)

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

  1. גורמים יכולים להיות שימושיים אם אתה רוצה פריטי סדר בצורה מסוימת, nonalphabetical להצגת תרשימים ולמטרות אחרות, כגון Poorהוא פחות Fairהוא פחות Goodהוא פחות Excellent.
  2. גורמים יכולים להתנהג אחרת ממה שניתן היה לצפות לפעמים. אני ממליץ לדבוק במיתרי אופי אלא אם כן יש לך סיבה טובה לרצות גורמים ספציפיים.

אתה יכול לשמור על מחרוזות הדמות שלך שלמות בעת יצירת מסגרות נתונים על ידי הוספת הארגומנט stringsAsFactors = FALSE:

myresults <- data.frame (מועמדים, מפלגה, הצבעות, stringsAsFactors = FALSE) str (myresults)

עכשיו, הערכים הם מה שציפיתם.

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

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

הצבעות <- ג (15248, 16723)

myresults2 <- data.frame (מועמדים, מפלגה, קולות)

str (myresults2)

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

אם עד עכשיו אתה חושב, "מדוע אינני יכול ליצור מסגרות נתונים שאינן משנות מחרוזות לגורמים באופן אוטומטי? ומדוע עלי לדאוג שמסגרות נתונים ישתמשו שוב בנתוני עמודה אחת אם אשכח להשלים את כל הנתונים? " להדלי וויקהאם הייתה אותה מחשבה. חבילת הטיבול שלו יוצרת מחלקה R, הנקראת גם tibble, שלדבריו היא "תפיסה מודרנית של מסגרות נתונים. הם שומרים על התכונות שעמדו במבחן הזמן ומפילים את התכונות שהיו נוחות אך כעת מתסכלות. "

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

myresults3 <- tibble :: tibble (מועמדים, מפלגה, קולות)

ותקבל הודעת שגיאה לפיה עמודת ההצבעה צריכה להיות באורך 4 ארבעה פריטים או באורך פריט אחד ( tibble()תחזור על פריט בודד כמה פעמים שצריך, אך רק עבור פריט אחד).

החזירו את עמודת ההצבעה לארבעה ערכים אם ברצונכם ליצור טינה עם הנתונים הבאים:

ספרייה (טיבבל)

הצבעות <- ג (15248, 16723, 230, 5234)

myresults3 <- קשקוש (מועמדים, מפלגה, קולות)

str (myresults3)

היא נראית דומה למסגרת נתונים - למעשה, היא מסגרת נתונים, אך עם כמה התנהגויות מיוחדות, כמו אופן הדפסתה. שימו לב גם כי העמודה של המועמדים היא מחרוזות תווים, ולא גורמים.

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

ייצוא נתונים

לעיתים קרובות לאחר שהיית את הנתונים שלך ב- R, אתה רוצה לשמור את התוצאות שלך. להלן כמה מהדרכים לייצא את הנתונים שאני נוטה להשתמש בהם ביותר:

שמור לקובץ CSV עם rio::export(myObjectName, file="myFileName.csv")וקובץ Excel עם rio::export(myObjectName, file="myFileName.xlsx"). rio מבין איזה פורמט קובץ אתה מעוניין בהתבסס על סיומת שם הקובץ. ישנם מספר פורמטים זמינים אחרים, כולל .tsvעבור נתונים המופרדים באמצעות כרטיסיות, .jsonעבור JSON ו- .xmlXML.

שמור באובייקט בינארי R שמקל על ההטענה חזרה ל- R בפגישות עתידיות. ישנן שתי אפשרויות.

Generic save() שומר אובייקט אחד או יותר בקובץ, כגון save(objectName1, objectName2, file="myfilename.RData"). כדי לקרוא נתונים אלה חזרה ל- R, אתה פשוט משתמש בפקודה load("myfilename.RData")וכל האובייקטים חוזרים עם אותם שמות באותו מצב שהיה להם קודם.

אתה יכול גם לשמור אובייקט יחיד בקובץ עם saveRDS(myobject, file="filename.rds"). ההנחה ההגיונית היא ש- loadRDS יקרא את הקובץ חזרה, אך במקום זאת הפקודה היא readRDS- ובמקרה זה רק הנתונים נשמרו, ולא שם האובייקט . לכן, עליכם לקרוא את הנתונים לשם אובייקט חדש, כגון mydata <- readRDS("filename.rds").

יש דרך שלישית לשמור אובייקט R במיוחד עבור R: יצירת פקודות R שישחזרו את האובייקט במקום האובייקט עם תוצאות סופיות. פונקציות ה- R הבסיסיות ליצירת קובץ R ליצירת אובייקט הם dput()or dump(). עם זאת, אני rio::export(myobject, "mysavedfile.R")אפילו קל יותר לזכור.

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

ניתן גם לייצא אובייקט R לתוך הלוח של Windows או Mac שלך עם ריו: rio::export(myObjectName, format). וגם, אתה יכול לייבא נתונים לתוך R מהלוח שלך באותה דרך: rio::import(file).

בונוס: convert()הפונקציה של rio מאפשרת לך - ניחשת נכון - להמיר סוג קובץ אחד למשנהו מבלי שתצטרך למשוך את הנתונים באופן ידני אל תוך החוצה R. ראה ?convertלמידע נוסף.

נקודה אחרונה: RStudio מאפשר לך ללחוץ כדי לייבא קובץ, מבלי שתצטרך לכתוב קוד בכלל. זה לא משהו שאני ממליץ עליו עד שנוח לך לייבא משורת הפקודה, אבל אני חושב שחשוב להבין את הקוד שמאחורי הייבוא. אבל אני מודה שזה יכול להיות קיצור דרך שימושי.

בכרטיסיה קבצים בחלונית הימנית התחתונה של RStudio, נווט אל הקובץ שברצונך לייבא ולחץ עליו. תראה אפשרות להציג קובץ או לייבא מערך נתונים. בחרו ייבוא ​​מערך נתונים כדי לראות תיבת דו-שיח שמציגה תצוגה מקדימה של הנתונים, מאפשרת לשנות את אופן ייבוא ​​הנתונים ומציגה תצוגה מקדימה של הקוד שייווצר.

בצע את כל השינויים שתרצה ולחץ על ייבוא, והנתונים שלך יועברו ל- R.

משאבים נוספים

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

  • Base R של read.csv()ו read.table()קבצי טקסט ייבוא (שימוש ?read.csvו ?read.tableכדי לקבל מידע נוסף). stringsAsFactors = FALSEיש צורך עם אלה אם אתה רוצה לשמור על מחרוזות הדמות שלך כמחרוזות אופי. write.csv() שומר ב- CSV.
  • rio משתמש בחבילת readxl של הדלי וויקהאם לקריאת קבצי אקסל. חלופה נוספת עבור Excel היא openxlsx, שיכולה לכתוב לקובץ Excel וגם לקרוא. עיין בתמונות החבילה openxlsx למידע על עיצוב הגיליונות האלקטרוניים שלך בעת הייצוא.
  • חבילת ה- readr של וויקהאם שווה גם היא להסתכל כחלק מ- "tidyverse". readr כולל פונקציות לקריאה של CSV, מופרדים באמצעות כרטיסיות, רוחב קבוע, יומני אינטרנט ומספר סוגים אחרים של קבצים. readr מדפיס את סוג הנתונים שקבעה עבור כל עמודה - מספר שלם, תו, כפול (מספרים שאינם שלמים) וכו '. זה יוצר טיפוסים.

ייבא ישירות מגיליון אלקטרוני של גוגל. חבילת גליונות Google מאפשרת לך לייבא נתונים מגיליון אלקטרוני של Google Sheets, גם אם הוא פרטי, על ידי אימות חשבון Google שלך. החבילה זמינה ב- CRAN; להתקין אותו באמצעות  install.packages("googlesheets"). לאחר טעינתו library("googlesheets"), קראו את טבלת ההיכרות המצוינת. בזמן כתיבת שורות אלה, ניתן היה להשיג את ויגינת המבוא ב- R בשעה vignette("basic-usage", package="googlesheets"). אם אינך רואה את זה, נסה help(package="googlesheets")ללחוץ על הקישור מדריכי משתמשים, סימוני אריזות ותיעוד אחר לקבלת ויגוניות זמינות, או עיין במידע החבילה ב- GitHub בכתובת //github.com/jennybc/googlesheets.

גרד נתונים מדפי אינטרנט באמצעות חבילת rvest ותוסף דפדפן SelectorGadget או סימנייה של JavaScript. SelectorGadget עוזר לך לגלות את אלמנטים CSS של נתונים שאתה רוצה להעתיק שנמצאים בדף HTML; ואז rvest משתמש ב- R כדי למצוא ולשמור את הנתונים האלה. זו לא טכניקה למתחילים גולמיים, אבל ברגע שיש לך קצת ניסיון R בחגורתך, ייתכן שתרצה לחזור ולבדוק זאת מחדש. יש לי כמה הוראות וסרטון כיצד לעשות זאת ב //bit.ly/Rscraping. ל- RStudio יש גם סמינר מקוון זמין לפי דרישה.

חלופות לבסיס פונקציות השמירה והקריאה של R. אם אתה עובד עם ערכות נתונים גדולות, המהירות עשויה להיות חשובה עבורך בעת שמירת וטעינה של קבצים. לחבילה data.table יש fread()פונקציה מהירה , אך היזהר מכך שהאובייקטים המתקבלים הם data.tables ולא מסגרות נתונים פשוטות; יש התנהגויות שונות. אם אתה רוצה מסגרת נתונים קונבנציונאלית, אתה יכול להשיג אחת עם as.data.frame(mydatatable)התחביר. של החבילה data.table fwrite()הפונקציה מיועדת כתיבה לקובץ CSV משמעותית מהר יותר מאשר בסיס R של write.csv().

שתי חבילות אחרות עשויות לעניין שמירה ואחזור נתונים. חבילת הנוצות נשמרת בפורמט בינארי שניתן לקרוא לתוך R או Python. וגם, את חבילת FST של read.fst()ו write.fst()ההצעה מהר חיסכון וטעינה של מסגרת נתון R אובייקטים-פלוס אפשרות דחיסה.