הקדמה

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


מטרות השיעור

עד סוף השיעור תדעו:

  • תכירו את סוגי המבנים וערכים ב R
  • תדעו איך לייצר את האובייקטים האלה
  • איך לבצע פעולות על וקטורים
  • איך לבצע פעולות על מטריצות
  • איך לגשת לטבלאות נתונים

כללי Syntax בסיסיים

לפני שנתחיל, מספר דברים שכדי לזכור:

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

קבלת עזרה

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

  • הקשת ? ולאחריו שם הפקודה
  • הקשת ?? ולאחריו שם הפקודה
  • חיפוש בחלונית החיפוש את שם הפקודה

תרגיל 1

Questions

  1. קבלו עזרה על הפקודה class . מה זה עושה?

  2. קבלו עזרה על הפקודה typeof . מה זה עושה?

  3. קבלו עזרה על הפקודה str. מה זה עושה?


Answers

  1. class מחזיר את סוג האובייקט

  2. typeof מחזיר את סוג ערך האובייקט

  3. str מראה את מבנה האובייקט


ערכים ומבנים ב R

סוגי ערכים ב R

הערכים ב R מתחלקים לסוגים הבאים:

  • מספר נומרי (numeric)
  • double - למשל 5.22
  • integer - למשל 5
  • טקסט (character) - למשל “hello”.
  • משתנה לוגי (logical) - למשל TRUE,FALSE.
  • פקטורים (factor) - סוג של integer מיוחד
  • פקטורים רגילים - כן,לא.
  • פקטורים אורדינאליים (ordinal factors) - גבוה,בינוני,נמוך.

סוגי מבנים ב R

הערכים האלה נשמרים ביחד במבנים מהסוגים הבאים:

  • סקאלר (scalar) - ערך בודד
  • וקטורים (vector) - מאגד רשימת ערכים מאותו סוג
  • מערכים (list) - מאגד רשימת ערכים מסוגים שונים
  • מטריצות (matrix) - וקטורים של ערכים מאותו סוג
  • טבלת נתונים (data frame)- וקטורים שונים בצורת טבלה
  • מבנים מסוג S3 ו S4 - מבנים בעלי ארגון קבוע המאפשרים הרחבת סוגי המבנים הבסיסיים

למעשה data frame הוא סוג מיוחד של מערך (list) עם וקטורים בגדלים שווים ובעלי שמות.


פקודות בסיסיות

יצירת משתנה

מייצרים משתנים בעזרת אופרטור ההשמה ->

(הקיצור הוא Alt -)

אפשר גם להשתמש בסימן = אבל נוהגים לשמור את זה לצרכים אחרים

פקודת ההשמה דורסת משתנה אם הוא כבר קיים

יצירת מערך

מאגדים ערכים ביחד בעזרת הפקודה ()c


תרגיל 2

Questions

  1. יצרו את המשתנה x שיכיל את המספר 5

  2. בדקו בעזרת class מה יצא לכם

  3. יצרו משתנה text1 טקסט (להשתמש בגרשיים)

  4. יצרו וקטור numbers1 של המספרים 1 עד 5

  5. יצרו וקטור names1 של השמות: dan, ephraim, gstat.

  6. בידקו בעזרת str מה יצא לכם.


Answers

x <- 5
x
## [1] 5
class(x)
## [1] "numeric"
x <- " this is a text"
x
## [1] " this is a text"
numbers1 <- c(1,2,3,4,5)
numbers1
## [1] 1 2 3 4 5

או

numbers1 <-1:5
numbers1
## [1] 1 2 3 4 5
names1 <- c("dan", "ephraim", "gstat")
names1
## [1] "dan"     "ephraim" "gstat"
str(names1)
##  chr [1:3] "dan" "ephraim" "gstat"

פעולות

אופרטורים לוגיים

  • הפעלת אופרטור לוגי מחזיר ערך לוגי TRUE או FALSE

פעולות חשבון

  • פעולת חשבון לא חוקי תחזיר ערך NaN
  • חלוקת מספר ב 0 תחזיר Inf או -Inf

פעולות מיזוג


התניות ומעגלים

צורת הכתיבה של התניה בסיסית היא:

if(condition) {do things}

ואם רוצים לעשות משהו במקרה שהתנאי לא מתקיים:

if (condition) {do things} else {do domething else}

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

ifelse(condition,do if true, do if false)

ב R יש את כל הפונקציות המעגליות הרגילות (for, while , repeat) נדגים את הסינטקס של for :

for(i in range) {do something}

למשל:

# for example
for(i in 1:5) {print(1:i)}
## [1] 1
## [1] 1 2
## [1] 1 2 3
## [1] 1 2 3 4
## [1] 1 2 3 4 5
# for with if example
for(i in 1:5) {
 if(i%%2 == 0){  
  print(i)
  }
}
## [1] 2
## [1] 4
# for with if else example
for(i in 1:5) {
 if(i%%2 == 0){  
  print('even')
  } else {
  print('odd')
  }
}
## [1] "odd"
## [1] "even"
## [1] "odd"
## [1] "even"
## [1] "odd"
  • ב R הרבה יותר משתלם ללמוד על משפחת apply או ספריית purrr במקום לעשות פונקציות מעגליות… *

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


ערכים חסרים

  • ערך חסר מסומן כ NA
  • רוב הפונקציות מאפשרות השמטת ערך חסר מהחישוב למשל:
    • mean(data, na.rm = TRUE)
  • אם לא עושים את זה - לרוב הפונקציות מקבלים הודעת שגיאה (ניתן לשלוט על זה בהגדרות מוקדמות)

בחירת נתונים מאובייקטים

בכל סוגי המבנים ניתן לשלוף נתונים באחד מ 3 דרכים:

  • בחירת נתונים לפי מקום
  • בחירת נתונים לפי תנאי (ערך לוגי)
  • בחירת נתונים לפי שם

בחירת נתונים בווקטורים ומטריצות

בחירת נתונים לפי מקום

בחירת נתונים בווקטורים נעשית כך:

VectorName[Index]

ועבור מטריצות זה נעשה כך:

MatrixName[Row Index, Column Index]
  • אם משמיטים מספר שורה או עמודה כל השורות או עמודות מוחזרות
  • ניתן לבחור בתווך שורות או עמודות בעזרת :
  • או בשורות או עמודות ספיציפיות בעזרת ()c

בהקשר של מערכים (list) יש הבדל משמעותי עם משתמשים ב [ או ב [[ לשלוף את הנתונים.


החלפת נתונים לפי מקום

באותו שיטה ניתן להחליף ערכים:


בחירת נתונים לפי תנאי

  • להחזרת וקטור/ מטריצות לפי תנאי : נשים את התנאי בתוך סוגריים מרובעים:
# Create Vector
x <- c(1,2,3,4,5,6,7,8,9,10)

# Subscript
x[x>4]
## [1]  5  6  7  8  9 10
  • החלפת ערך באותה צורה
x[x==6] <- 999

x
##  [1]   1   2   3   4   5 999   7   8   9  10

מחיקות

  • מחיקת שורה תעשה/עמודה על ידי הצבת NULL במקום השורה/עמודה
  • מחיקת ערך בטבלה בעזרת הצבת NA
  • מחיקת משתנה על ידי הפקודה rm
  • מחיקת כמה משתנים בעזרת rm עם שמות המשתנים מופרדים בפסיק

תרגיל 3

Questions

  1. תייצרו וקטור של הספרות 1 עד 5, ועוד אחד של הספרות 6 עד 10. תאגדו אותם למטריצה של 2 עמודות בשם X.
  2. תציבו את הערך החסר NA במקום השורה השלישית העמודה השניה.
  3. תחשוב סטטיסטיקה בסיסית למטריצה.
  4. תחברו למטריצה עוד עמודה של האותיות a עד e .
  5. איזה סוג אובייקט יש לכם עכשיו?
  6. יצר משתנה חדש הכולל 10,000 תצפיות מהתפלגות נורמלית בעזרת rnorm
  7. צייר היסטוגרמה של המשתנה הזה
  8. מחקו את כל מה שעשיתם :) בעזרת rm

Answers

x <- c(1,2,3,4,5)
y <- c(6,7,8,9,10)

m1 <- cbind(x,y)

m1
##      x  y
## [1,] 1  6
## [2,] 2  7
## [3,] 3  8
## [4,] 4  9
## [5,] 5 10
m1[3,2] <- NA

m1
##      x  y
## [1,] 1  6
## [2,] 2  7
## [3,] 3 NA
## [4,] 4  9
## [5,] 5 10
# this works
summary(m1)
##        x           y        
##  Min.   :1   Min.   : 6.00  
##  1st Qu.:2   1st Qu.: 6.75  
##  Median :3   Median : 8.00  
##  Mean   :3   Mean   : 8.00  
##  3rd Qu.:4   3rd Qu.: 9.25  
##  Max.   :5   Max.   :10.00  
##              NA's   :1
# this doesnt
mean(m1)
## [1] NA
# this does
mean(m1, na.rm = TRUE)
## [1] 5.222222
m1 <- cbind(m1,c("a","b","a","b","a"))
class(m1)
## [1] "matrix"
str(m1)
##  chr [1:5, 1:3] "1" "2" "3" "4" "5" "6" "7" NA "9" ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : NULL
##   ..$ : chr [1:3] "x" "y" ""
new_var <- rnorm(10000)
hist(new_var)

rm(m1,names1,new_var,numbers1,x,y)

פונקציות שימושיות


פקודות סטטיסטיות

  • summary – סיכום סטטיסטי למשתנה
  • table – טבלת התפלגות
  • n – ספירה
  • mean – ממוצע
  • max – מקסימום
  • min – מינימום
  • median – חציון
  • sd – סטיית תקן
  • rnorm – דגום n תצפיות מהתפלגות נורמלית

פקודות לשינוי סוג משתנה

  • factor – הגדרת משתנה כפקטור
  • asDate – הגדרת תאריך בפורמטים שונים
  • as.data.frame – הפוך וקטור או מטריצה לטבלה
  • as.numeric – הפוך וקטור לנומרי

פקודות אחרות

  • rm – מחיקת משתנה
  • dim – מחזיר את מימדי האובייקט
  • nrow – מספר השורות באובייקט
  • length – מספר הרשומות באובייקט
  • head – ערכים הראשונים

פקודות לערכים חסרים

  • na.omit – מחזיר את x ללא שורות שבהן באחד העמודות ערך חסר.
  • anyNA – מחזיר סקאלר TRUE/FALSE אם אחד מערכי x הוא NA.
  • is.na – מחזיר וקטור לוגי TRUE/FALSE עבור ערכי x שהם NA.
  • is.nan – מחזיר וקטור לוגי TRUE/FALSE עבור ערכי x שהם NaN.

פקודות גרפיות

  • hist – היסטוגרמה
  • boxplot – גרף box plot
  • plot – פקודה גנרית לכל מיני גרפים