Menu

מחרוזות ב-R: paste, sprintf, gsub, substr ועוד

כל מה שצריך לטקסט ב-R: יצירת מחרוזות, חיבור עם paste ו-paste0, עיצוב עם sprintf, וחיפוש עם gsub, grepl ו-strsplit.

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

יצירת מחרוזות ב-R

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

תווי בריחה עם לוכסן הפוך עובדים כמו ברוב השפות: \" למירכאות מילוליות, \n לירידת שורה, \t לטאב, \\ ללוכסן הפוך עצמו.

ועכשיו הטעות שכל מתחיל ב-R עושה בדיוק פעם אחת: לשאול מחרוזת מה האורך שלה עם length().

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

חיבור מחרוזות: paste() ו-paste0()

אין ב-R + למחרוזות. חיבור נעשה עם paste(), שמחברת את הארגומנטים שלה עם רווח כברירת מחדל, ועם paste0(), שמחברת בלי כלום:

מכיוון ש-paste וקטורית, מתן וקטור לה בונה הרבה מחרוזות בבת אחת: כך מייצרים שמות קבצים, תוויות ומזהים בשורה אחת:

והארגומנט collapse עושה את ההפך: הוא מאחד וקטור שלם למחרוזת אחת עם מפריד לבחירתכם:

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

עיצוב עם sprintf()

כשצריך מספרים מעוצבים בתוך טקסט, מספר קבוע של ספרות אחרי הנקודה, רוחב מרופד, paste() נגמרת ו-sprintf() נכנסת לתמונה. היא משתמשת בקודי עיצוב בסגנון C: %s למחרוזות, %d למספרים שלמים, %f לשברים עשרוניים:

%.1f פירושו "ספרה אחת אחרי הנקודה", %.3f שלוש, ו-%05d מרפד לחמש ספרות עם אפסים. %% כפול מפיק סימן אחוז מילולי. גם sprintf() וקטורית, כך שהיא יכולה לעצב עמודה שלמה של ערכים בקריאה אחת. ראו קלט ופלט לדפוס הדיווח של sprintf() יחד עם cat().

שינוי אותיות וחיתוך: toupper(), tolower(), substr()

המרת אותיות גדולות וקטנות עושה בדיוק מה שהשם אומר:

tolower() מצדיקה את קיומה בנרמול של נתונים מבולגנים לפני השוואה: "Yes", "YES" ו-"yes" הופכים כולם לאותו ערך.

substr(x, start, stop) שולפת קטע לפי מיקום התו, בספירה מ-1 (ב-R האינדקסים מתחילים מ-1 בכל מקום):

שתי נקודות הקצה כלולות: המיקומים 1 עד 11 נותנים "Programming".

חיפוש והחלפה: sub(), gsub() ו-grepl()

sub() מחליפה את המופע הראשון של תבנית; gsub() ("global substitute") מחליפה את כולם:

פרט קריטי אחד: התבנית היא ביטוי רגולרי כברירת מחדל, לא טקסט מילולי. לתווי regex כמו ., *, ( ו-? יש משמעויות מיוחדות: . חשופה מתאימה לכל תו. כשמתכוונים לטקסט המילולי, העבירו fixed = TRUE:

השורה הראשונה נותנת a-b-c; השנייה נותנת -----, כי בתור regex ה-. התאימה לכל תו ותו. עד שלומדים regex, הפכו את fixed = TRUE לברירת המחדל שלכם ואף פעם לא תיפגעו.

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

התוצאה הראשונה מסמנת אילו שמות קבצים מכילים .csv; השנייה משתמשת בווקטור הלוגי הזה כדי להשאיר רק את ההתאמות.

פיצול וקיצוץ: strsplit() ו-trimws()

strsplit() חותכת מחרוזת לחלקים לפי מפריד. המוזרות היחידה שלה: היא מחזירה רשימה, כי היא יכולה לפצל הרבה מחרוזות בבת אחת. למחרוזת בודדת, קחו את האיבר הראשון עם [[1]]:

ו-trimws() מסירה את הרווחים שנתונים מהעולם האמיתי תמיד מגיעים עטופים בהם:

כברירת מחדל היא מקצצת את שני הקצוות; which = "left" או "right" מקצצים צד אחד בלבד (השמות מתייחסים לתחילת המחרוזת ולסופה).

החלופה stringr

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

library(stringr)

str_detect(files, "csv")            # like grepl(), data first
str_replace_all(s, "good", "great") # like gsub(), arguments reordered
str_length("hello")                 # like nchar()

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

מה לקחת מכאן

  • מחרוזות משתמשות במירכאות כפולות לפי המוסכמה; nchar() סופרת תווים, length() סופרת איברים של וקטור.
  • חברו עם paste() / paste0(); sep מדביק ארגומנטים, collapse מדביק וקטור למחרוזת אחת.
  • sprintf() מטפלת בפלט מעוצב: %s, %d, %.2f.
  • sub() מחליפה את ההתאמה הראשונה, gsub() את כל ההתאמות, grepl() בודקת התאמות: כולן regex כברירת מחדל, אז העבירו fixed = TRUE לטקסט מילולי.
  • strsplit() מחזירה רשימה (קחו [[1]]); trimws() מנקה קלט מרופד.

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

שאלות נפוצות

איך מחברים מחרוזות ב-R?

עם paste() או paste0(): אין ב-R + למחרוזות. paste("data", "science") נותן "data science" (מופרד ברווח כברירת מחדל); paste0("data", "science") מחבר בלי כלום. השתמשו ב-sep = כדי לשנות את המפריד וב-collapse = כדי לאחד וקטור שלם למחרוזת אחת.

איך מקבלים את האורך של מחרוזת ב-R?

nchar("hello") מחזירה 5, מספר התווים. length("hello") מחזירה 1: ב-R, length() סופרת איברים של וקטור, ומחרוזת בודדת היא וקטור של איבר אחד. בלבול בין length() ל-nchar() הוא הטעות הקלאסית של מתחילים.

מה ההבדל בין sub() ל-gsub() ב-R?

שתיהן מחפשות ומחליפות, אבל sub() מחליפה רק את ההתאמה הראשונה, בעוד ש-gsub() ("global sub") מחליפה את כל ההתאמות. שתיהן מתייחסות לתבנית כביטוי רגולרי כברירת מחדל; העבירו fixed = TRUE כדי להתאים את הטקסט המילולי במקום.

איך מפצלים מחרוזת ב-R?

strsplit(x, split) מפצלת לפי תבנית, אבל היא מחזירה רשימה (כי היא יכולה לפצל הרבה מחרוזות בבת אחת). למחרוזת בודדת, קחו את האיבר הראשון: strsplit("a,b,c", ",")[[1]] נותן את וקטור התווים "a" "b" "c".

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

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

להתחיל