עיבוד נתונים "עיבוד נתונים" כולל מבואלתכנותמדעיוסטטיסטי R חלק 10 פעולות נתונים מתקדמות שליפת נתונים סידור הנתונים מחדש קריאה בשמות אחרים לעמודות יצירת עמודות חדשות יצירת טבלה חדשה איחוד כמה טבלאות סיכום נתונים נעבוד גם עם פונקציות בסיסיות של R, וגם עם פונקציות מחבילות ייעודיות R חלק 10 2 R חלק 10 1 cats חילוץ אברים מווקטור / עמודה > library(mass) > head(cats) Sex Bwt Hwt 1 F 2.0 7.0 2 F 2.0 7.4 3 F 2.0 9.5 4 F 2.1 7.2 5 F 2.1 7.3 6 F 2.1 7.6 > str(cats) 'data.frame': 144 obs. of 3 variables: $ Sex: Factor w/ 2 levels "F","M": 1 1 1 1 1 1 1 $ Bwt: num 2 2 2 2.1 2.1 2.1 2.1 2.1 2.1 2.1 $ Hwt: num 7 7.4 9.5 7.2 7.3 7.6 8.1 8.2 8.3 איך מחלצים את משקל הגוף של החתולים הזכרים בלבד? אפשר דרך ערכיT/F, ואפשר דרך אינדקסים R חלק 10 3 > males.tf <- cats$sex == "M" > head(males.tf) [1] FALSE FALSE FALSE FALSE FALSE FALSE > males.ind <- which(cats$sex == "M") > head(males.ind) [1] 48 49 50 51 52 53 R חלק 10 4
/ עמודה וקטוריזציה חילוץ אברים מווקטור > Bwt.males.TF <- cats$bwt[males.tf] > head(bwt.males.tf) [1] 2.0 2.0 2.1 2.2 2.2 2.2 > Bwt.males.ind <- cats$bwt[males.ind] > head(bwt.males.ind) [1] 2.0 2.0 2.1 2.2 2.2 2.2 > cats[males.tf, "Bwt"] > subset(cats, Sex == "M", select=bwt) חלק 10 אפשר גם כך: וגם כך: R וקטוריזציה כמעט תמיד עדיפה על לולאות יותר מהיר, יותר ברור הרבה פונקציות ב- R בנויות עבור וקטורים / מטריצות > mean(log(cats$hwt)) [1] 2.338899 > head(is.na(cats), 5) Sex Bwt Hwt 1 FALSE FALSE FALSE 2 FALSE FALSE FALSE 3 FALSE FALSE FALSE 4 FALSE FALSE FALSE 5 FALSE FALSE FALSE R חלק 10 ב' תש"ף, 5 2019/20 6 משפחת apply apply משפחת הפונקציות apply מרחיבה את אפשרויות הווקטוריזציה נלמד ראשית על פונקציות מהתקנת הבסיס של R apply lapply tapply פונקציות בסיס קרובות, שלא נלמד עליהן aggregate,mapply,sapply apply מיועדת לעבוד עם מטריצות (וגם מערכים) > A <- matrix(1:6, 2, 3) > A [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 > apply(a, 1, sum) [1] 9 12 > apply(a, 2, sum) [1] 3 7 11 בשביל סכומים או ממוצעים, יותר יעיל לעבוד עם colsums, rowsums, colmeans, rowmeans R חלק 10 R חלק 10 ב' תש"ף, 7 2019/20 8
apply apply f <- function(v){ return(sum(v%%2 == 0)) } > apply(a, 2, f) [1] 1 1 1 כמה איברים זוגיים יש בכל עמודה? > apply(a, 2, function(v){sum(v%%2 == 0)}) [1] 1 1 1 אפשר גם כך אפשר להעביר דרך apply ארגומנטים לפונקציה שמפעילים על השורות / עמודות g <- function(v, k){ return(sum(v%%k == 0)) } > apply(a, 2, g, k=2) [1] 1 1 1 > apply(a, 2, g, k=3) [1] 0 1 1 חלק 10 R חלק 10 ב' תש"ף, 9 2019/20 R 10 apply lapply > B [,1] [,2] [,3] [1,] 1 2 3 [2,] 5 2 6 > apply(b, 2, unique) [[1]] [1] 1 5 כשאין ברירה, apply מחזירה רשימה הפונקציה lapply מקבלת כקלט וקטור (או רשימה), ומפעילה על כל אחד מהאברים (או פריטים) פונקציה נתונה lapply תמיד מחזירה רשימה [[2]] [1] 2 [[3]] [1] 3 6 R חלק 10 R חלק 10 ב' תש"ף, 11 2019/20 12
lapply lapply > lapply(1:4, sqrt) [[1]] [1] 1 [[2]] [1] 1.414214 [[3]] [1] 1.732051 [[4]] [1] 2 חלק 10 R חלק 10 ב' תש"ף, 13 2019/20 R > y <- list(c(1,3,3), c(4,4,4,5,5,6,8)) > y [[1]] [1] 1 3 3 [[2]] [1] 4 4 4 5 5 6 8 > lapply(y, unique) [[1]] [1] 1 3 [[2]] [1] 4 5 6 8 14 tapply tapply tapply מקבלת נתונים (בד"כ כווקטור), מפצלת אותם לקבוצות לפי פקטור, ומחזירה את תוצאת הפעלת פונקציה נתונה על כל קבוצה > tapply(cats$bwt, cats$sex, summary) $F Min. 1st Qu. Median Mean 3rd Qu. Max. 2.00 2.15 2.30 2.36 2.50 3.00 > max.bwt <- tapply(cats$bwt, cats$sex, max) > max.bwt F M 3.0 3.9 $M Min. 1st Qu. Median Mean 3rd Qu. Max. 2.0 2.5 2.9 2.9 3.2 3.9 R חלק 10 R חלק 10 ב' תש"ף, 15 2019/20 16
החבילה dplyr ncyflights13 החבילה dplyr מאפשרת עיבוד נתונים בגישה אחרת נתקין ונטען חבילה גדולה יותר,,tidyverse שכוללת את dplyr לצד חבילות נוספות שנצטרך לא להיבהל מהודעות המערכת בזמן ההתקנה > library(tidyverse) נדגים את dplyr דרך נתונים שבחבילה,ncyflights13 הכוללת מידע על 336,776 טיסות פנים שיצאו מניו-יורק בשנת 2013 > library(nycflights13) הנתונים שנעבוד איתם נמצאים במשתנה flights R חלק 10 18 R חלק 10 17 > flights # A tibble: 336,776 x 19 year month day dep_time sched_dep_time dep_delay arr_time <int> <int> <int> <int> <int> <dbl> <int> 1 2013 1 1 517 515 2. 830 2 2013 1 1 533 529 4. 850 3 2013 1 1 542 540 2. 923 4 2013 1 1 544 545-1. 1004 5 2013 1 1 554 600-6. 812 6 2013 1 1 554 558-4. 740 7 2013 1 1 555 600-5. 913 8 2013 1 1 557 600-3. 709 9 2013 1 1 557 600-3. 838 10 2013 1 1 558 600-2. 753 # with 336,766 more rows, and 12 more variables: # sched_arr_time <int>, arr_delay <dbl>, carrier <chr>, # flight <int>, tailnum <chr>, origin <chr>, dest <chr>, # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, # time_hour <dttm> tibble tibble המשתנה flights הוא מסוג,tibble שזה מעין מסגרת נתונים "משופרת" למשל, בהדפסת tibble למסך, לכל עמודה מופיע בכותרת <int> עבור מספרים שלמים <dbl> עבור מספרים ממשיים <chr> עבור מחרוזות יש גם הבדלים קלים בטיפול בנתונים; למשל, עמודה של תווים לא נשמרת אוטומטית כפקטור תרגיל: לכמה יעדים שונים יצאו טיסות? הופכים מסגרת נתונים ל- tibble R חלק 10 19 ע"י הפקודה as_tibble > cats.2 <- as_tibble(cats) > cats.2 # A tibble: 144 x 3 Sex Bwt Hwt * <fct> <dbl> <dbl> 1 F 2.00 7.00 2 F 2.00 7.40 3 F 2.00 9.50 4 F 2.10 7.20 5 F 2.10 7.30 6 F 2.10 7.60 7 F 2.10 8.10 8 F 2.10 8.20 9 F 2.10 8.30 10 F 2.10 8.50 # with 134 more rows R חלק 10 20
tibble dplyr קוראים tibble ישירות מקובץ (מופרד ע"י טאבים) ע"י > branches <- read_tsv("branches.txt") > branches # A tibble: 20 x 6 name city region employees area revenue <chr> <chr> <chr> <int> <int> <dbl> 1 Bialik Tveria north 12 135 1.30 2 Carmel Haifa north 18 260 3.70 3 Shoshanim Raanana center 9 85 2.40 4 Hadar Tel Aviv center 24 310 5.50 5 Orot Tel Aviv center 15 270 2.60 שפע פרטים בתיעוד הפונקציה read_tsv R חלק 10 הפונקציות הבסיסיות של dplyr הן filter בחירת שורות על פי תנאים R חלק 10 ב' תש"ף, 21 2019/20 22 arrange שינוי סדר שורות select בחירת עמודות על פי השם שלהן mutate יצירת עמודות חדשות מתוך עמודות קיימות summarize סיכום עמודות group_by עבודה עם קבוצות של שורות כל הפונקציות עובדות גם על מסגרות נתונים רגילות, וגם על tibble םי- נקרא לשניהם להלן "טבלאות" dplyr filter כל הפונקציות הנ"ל עובדות באופן דומה: הארגומנט הראשון הוא טבלה הארגומנטים הבאים מתארים את הפעולה שיש לבצע, לפי שמות העמודות (שמופיעים ללא גרשיים) התוצאה היא טבלה חדשה אפשר לבצע סדרת פעולות זו אחר זו, כדי לקבל את התוצאה הסופית הפונקציה filter בוחרת שורות על פי תנאי אחד או יותר למשל, כל הטיסות שהמריאו ב- 3 בנובמבר: R חלק 10 23 > filter(flights, month == 11, day == 3) # A tibble: 902 x 19 year month day dep_time sched_dep_time dep_delay arr_time <int> <int> <int> <int> <int> <dbl> <int> 1 2013 11 3 519 520-1. 751 2 2013 11 3 538 545-7. 824 3 2013 11 3 553 600-7. 918 4 2013 11 3 553 600-7. 1028 5 2013 11 3 554 600-6. 709 6 2013 11 3 554 600-6. 839 7 2013 11 3 554 600-6. 848 R חלק 10 24
filter תרגילים arrange כתבו פקודות הבוחרות את כל הטיסות שהמריאו בתאריכים 10-20 בנובמבר כל הטיסות שהמריאו ב- 1 בינואר או ב- 1 במרץ כל הטיסות שהמריאו משדה התעופה JFK ושנחתו באיחור של שעתיים לפחות.1.2.3 הפונקציה arrange ממיינת טבלה הארגומנט הראשון הוא הטבלה, ואחריו שמות העמודות לפיהן צריך למיין > arrange(flights, dep_time) # A tibble: 336,776 x 19 year month day dep_time sched_dep_time dep_delay arr_time <int> <int> <int> <int> <int> <dbl> <int> 1 2013 1 13 1 2249 72. 108 2 2013 1 31 1 2100 181. 124 3 2013 11 13 1 2359 2. 442 4 2013 12 16 1 2359 2. 447 5 2013 12 20 1 2359 2. 430 6 2013 12 26 1 2359 2. 437 R חלק 10 26 R חלק 10 25 arrange arrange הארגומנט השלישי קובע את המיון במקרי תיקו של הארגומנט השני; הרביעי במקרי תיקו של השלישי, וכו' > arrange(flights, dep_time, month, day) # A tibble: 336,776 x 19 year month day dep_time sched_dep_time dep_delay arr_time <int> <int> <int> <int> <int> <dbl> <int> 1 2013 1 13 1 2249 72. 108 2 2013 1 31 1 2100 181. 124 3 2013 2 11 1 2100 181. 111 4 2013 2 24 1 2245 76. 121 5 2013 3 8 1 2355 6. 431 6 2013 3 18 1 2128 153. 247 R חלק 10 > arrange(flights, desc(dep_time), month, day) # A tibble: 336,776 x 19 מיון לפי סדר יורד: year month day dep_time sched_dep_time dep_delay arr_time <int> <int> <int> <int> <int> <dbl> <int> 1 2013 2 7 2400 2359 1. 432 2 2013 2 7 2400 2359 1. 443 3 2013 2 11 2400 2135 145. 251 4 2013 3 15 2400 2359 1. 324 5 2013 3 22 2400 2358 2. 339 6 2013 3 25 2400 2355 5. 339 7 2013 4 2 2400 2359 1. 339 8 2013 4 4 2400 2355 5. 347 9 2013 4 20 2400 2359 1. 338 R חלק 10 ב' תש"ף, 27 2019/20 28
select select הפונקציה select בוחרת עמודות מטבלה > select(flights, month, day, air_time) # A tibble: 336,776 x 3 month day air_time <int> <int> <dbl> 1 1 1 227. 2 1 1 227. 3 1 1 160. 4 1 1 183. 5 1 1 116. 6 1 1 150. היזהרו מקונפליקט עם select של החבילה!MASS R חלק 10 > select(flights, month, day, starts_with("dep")) # A tibble: 336,776 x 4 month day dep_time dep_delay <int> <int> <int> <dbl> 1 1 1 517 2. > select(flights, month, day, ends_with("time")) # A tibble: 336,776 x 7 month day dep_time sched_dep_time arr_time sched_arr_time <int> <int> <int> <int> <int> <int> 1 1 1 517 515 830 819 > select(flights, month, day, contains("de")) # A tibble: 336,776 x 7 month day dep_time sched_dep_time dep_delay arr_delay dest <int> <int> <int> <int> <dbl> <dbl> <chr> 1 1 1 517 515 2. 11. IAH R חלק 10 ב' תש"ף, 29 2019/20 30 select mutate עוד פונקציות ממשפחת :select > rename(flights, y = year, m = month, d = day) # A tibble: 336,776 x 19 y m d dep_time sched_dep_time dep_delay arr_time <int> <int> <int> <int> <int> <dbl> <int> 1 2013 1 1 517 515 2. 830 2 2013 1 1 533 529 4. 850 > select(flights, origin, dest, everything()) # A tibble: 336,776 x 19 origin dest year month day dep_time sched_dep_time dep_delay <chr> <chr> <int> <int> <int> <int> <int> <dbl> 1 EWR IAH 2013 1 1 517 515 2. 2 LGA IAH 2013 1 1 533 529 4. כל הפונקציות הנ"ל לא שינו את תוכן flights שבזיכרון הפונקציה mutate מוסיפה עמודות חדשות לטבלה נגדיר קודם טבלה מצומצמת, שאיתה נעבוד > flights.2 <- select(flights, origin, distance, air_time, arr_delay, dep_delay) > flights.2 # A tibble: 336,776 x 5 origin distance air_time arr_delay dep_delay <chr> <dbl> <dbl> <dbl> <dbl> 1 EWR 1400. 227. 11. 2. 2 LGA 1416. 227. 20. 4. 3 JFK 1089. 160. 33. 2. 4 JFK 1576. 183. -18. -1. 5 LGA 762. 116. -25. -6. R חלק 10 31 R חלק 10 32
mutate mutate > mutate(flights.2, speed = distance / (air_time / 60), gain = arr_delay - dep_delay) # A tibble: 336,776 x 7 origin distance air_time arr_delay dep_delay speed gain <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 EWR 1400. 227. 11. 2. 370. 9. 2 LGA 1416. 227. 20. 4. 374. 16. 3 JFK 1089. 160. 33. 2. 408. 31. 4 JFK 1576. 183. -18. -1. 517. -17. 5 LGA 762. 116. -25. -6. 394. -19. 6 EWR 719. 150. 12. -4. 288. 16. 7 EWR 1065. 158. 19. -5. 404. 24. תרגיל: צרו טבלה חדשה בשם,flights.3 הכוללת את כל העמודות של,flights ובנוסף להן, את העמודות dep_hour dep_min arr_hour arr_min חלק 10 R חלק 10 ב' תש"ף, 33 2019/20 R 34 mutate transmute כדי להשמיט עמודה מטבלה: > mutate(flights.2, origin = NULL) # A tibble: 336,776 x 4 distance air_time arr_delay dep_delay <dbl> <dbl> <dbl> <dbl> 1 1400. 227. 11. 2. 2 1416. 227. 20. 4. 3 1089. 160. 33. 2. 4 1576. 183. -18. -1. 5 762. 116. -25. -6. 6 719. 150. 12. -4. 7 1065. 158. 19. -5. 8 229. 53. -14. -3. 9 944. 140. -8. -3. 10 733. 138. 8. -2. # with 336,766 more rows R חלק 10 > transmute(flights.2, origin, # A tibble: 336,776 x 3 origin speed gain <chr> <dbl> <dbl> 1 EWR 370. 9. 2 LGA 374. 16. 3 JFK 408. 31. 4 JFK 517. -17. 5 LGA 394. -19. 6 EWR 288. 16. הפונקציה transmute יוצרת טבלה חדשה speed = distance / (air_time / 60), gain = arr_delay - dep_delay) R חלק 10 ב' תש"ף, 35 2019/20 36
summarize summarize הפונקציה summarize (או (summarise מסכמת נתונים של עמודה > summarize(flights, mean_dist = mean(distance)) # A tibble: 1 x 1 mean_dist <dbl> 1 1040. פונקציות נפוצות לשימוש בתוך :summarize R חלק 10 median min, max n summarize שימושית בעיקר כשהיא מופעלת יחד עם,group_by שזו פונקציה שיוצרת טבלה "מקובצת" > flights_by_origin <- group_by(flights, origin) > flights_by_origin # A tibble: 336,776 x 19 # Groups: origin [3] year month day dep_time sched_dep_time dep_delay arr_time <int> <int> <int> <int> <int> <dbl> <int> 1 2013 1 1 517 515 2. 830 > summarize(flights_by_origin, mean_dist = mean(distance)) # A tibble: 3 x 2 origin mean_dist <chr> <dbl> 1 EWR 1057. 2 JFK 1266. 3 LGA 780. R חלק 10 ב' תש"ף, 37 2019/20 38 summarize summarize עוד דוגמא: > flights_by_date <- group_by(flights, year, month, day) > summarize(flights_by_date, flight_count = n()) # A tibble: 365 x 4 # Groups: year, month [?] year month day flight_count <int> <int> <int> <int> 1 2013 1 1 842 2 2013 1 2 943 3 2013 1 3 914 4 2013 1 4 915 5 2013 1 5 720 6 2013 1 6 832 7 2013 1 7 933 8 2013 1 8 899 9 2013 1 9 902 10 2013 1 10 932 # with 355 more rows R חלק 10 נציג גרפית את הקשר בין המרחק ליעד לבין ממוצעמשך האיחור בטיסה אליו ראשית, ניצור טבלה חדשה, מקובצת ע"פ היעד by_dest <- group_by(flights, dest) לכל יעד, נחשב את ממוצע מרחק הטיסה, ואת ממוצע האיחור בנחיתה delay <- summarize(by_dest, dist = mean(distance, na.rm = T), delay = mean(arr_delay, na.rm = T)) R חלק 10 ב' תש"ף, 39 2019/20 40
summarize pipe נציג דיאגרמת פיזור של שני המשתנים plot(delay$dist, delay$delay, xlab="mean distance", ylab="mean delay") הפתרון האחרון היה קצת מסורבל, כי נאלצנו להשתמש ב"טבלת ביניים", by_dest גישה אחרת: להשתמש ב- pipe של,dplyr שהאופרטור שלו הוא %<% delay <- flights %>% group_by(dest) %>% summarize(dist = mean(distance, na.rm = TRUE), delay = mean(arr_delay, na.rm = TRUE)) plot(delay$dist, delay$delay) ה- pipe מעביר את הפלט של הפונקציה שמשמאלו, להיות "כאילו" הארגומנט הראשון של הפונקציה שמימינו R חלק 10 R חלק 10 ב' תש"ף, 41 2019/20 42 pipe תרגילים פורמט "רחב" מול "ארוך" חזרו על התרגיל הקודם, אבל שהפעם בגרף ייכללו רק יעדים שהגיעו אליהם יותר מ- 20 טיסות, ולא ייכלל היעד הונולולו (HNL) מהו היעד שממוצע האיחור בנחיתה בו הוא הגדול ביותר? במהלך איזו שעה האיחור הממוצע בהמראה מ- JFK הוא הגדול ביותר, ומהו האיחור הממוצע? מהו שדה התעופה הנוסף, פרט להונולולו, שהמרחק אליו גדול מ- 3000?.1.2.3.4 בניסוי קליני, מודדים אצל כל נבדק רמה של חומר מסוים בדם שלוש פעמים: לפני הטיפולים (pre) אחרי טיפול א' (treat.a) אחרי טיפול ב' (treat.b) את הנתונים ניתן לשמור במסגרת נתונים בשני פורמטים: פורמט רחב :(wide) שורה אחת לכל נבדק, עם עמודות נפרדות לכל מדידה פורמט ארוך :(long) שלוש שורות לכל נבדק, עם מדידה בודדת בכל שורה R חלק 10 R חלק 10 ב' תש"ף, 43 2019/20 44
פורמט "רחב" מול "ארוך" פורמט "רחב" מול "ארוך" > dat_wide subject sex pre treat.a treat.b 1 1 M 7.9 12.3 10.7 2 2 F 6.3 10.6 11.1 3 3 F 9.5 13.1 13.8 4 4 M 11.5 13.4 12.9 חלק 10 R חלק 10 ב' תש"ף, 45 2019/20 R > dat_long subject sex condition measurement 1 1 M pre 7.9 2 1 M treat.a 12.3 3 1 M treat.b 10.7 4 2 F pre 6.3 5 2 F treat.a 10.6 6 2 F treat.b 11.1 7 3 F pre 9.5 8 3 F treat.a 13.1 9 3 F treat.b 13.8 10 4 M pre 11.5 11 4 M treat.a 13.4 12 4 M treat.b 12.9 46 פורמט "רחב" מול "ארוך" פורמט "רחב" מול "ארוך" יש פונקציות / תוכנות שבנויות לעבוד עם פורמט רחב, ויש כאלה עם פורמט ארוך ממירים מפורמט ארוך לרחב ע"י הפונקציה spread > spread(dat_long, condition, measurement) subject sex pre treat.a treat.b 1 1 M 7.9 12.3 10.7 2 2 F 6.3 10.6 11.1 3 3 F 9.5 13.1 13.8 4 4 M 11.5 13.4 12.9 ממירים מפורמט רחב לארוך ע"י הפונקציה gather > gather(dat_wide, condition, measurement, pre:treat.b) subject sex condition measurement 1 1 M pre 7.9 2 2 F pre 6.3 3 3 F pre 9.5 4 4 M pre 11.5 5 1 M treat.a 12.3 6 2 F treat.a 10.6 7 3 F treat.a 13.1 8 4 M treat.a 13.4 9 1 M treat.b 10.7 R חלק 10 R חלק 10 ב' תש"ף, 47 2019/20 48
פורמט "רחב" מול "ארוך" pull כדי להיות עוד יותר דומה ל- dat_long : > gather(dat_wide, condition, measurement, pre:treat.b) %>% arrange(subject) subject sex condition measurement 1 1 M pre 7.9 2 1 M treat.a 12.3 3 1 M treat.b 10.7 4 2 F pre 6.3 5 2 F treat.a 10.6 6 2 F treat.b 11.1 7 3 F pre 9.5 8 3 F treat.a 13.1 9 3 F treat.b 13.8 R חלק 10 הפונקציה pull שולפת עמודה מטבלה, ומחזירה אותה כווקטור (או פקטור) > flights %>% pull(origin) [1] "EWR" "LGA" "JFK" "JFK" "LGA" "EWR" "EWR" "LGA" [9] "JFK" "LGA" "JFK" "JFK" "JFK" "EWR" "LGA" "JFK" [17] "EWR" "LGA" "LGA" "EWR" "LGA" "LGA" "EWR" "JFK" [25] "EWR" "EWR" "JFK" "JFK" "JFK" "EWR" "EWR" "LGA" [33] "LGA" "EWR" "LGA" "JFK" "JFK" "EWR" "LGA" "LGA" [41] "EWR" "EWR" "LGA" "LGA" "JFK" "EWR" "EWR" "EWR > flights %>% pull(origin) %>% head(15) [1] "EWR" "LGA" "JFK" "JFK" "LGA" "EWR" "EWR" "LGA" "JFK" [10] "LGA" "JFK" "JFK" "JFK" "EWR" "LGA" R חלק 10 ב' תש"ף, 49 2019/20 50 טבלאות איחוד טבלאות איחוד > musicians.1 # A tibble: 3 x 3 name yr.birth cntry <chr> <dbl> <chr> 1 John Lennon 1940 UK 2 Stevie Wonder 1950 USA 3 Beyonce 1981 USA > musicians.2 # A tibble: 1 x 3 name yr.birth cntry <chr> <dbl> <chr> 1 Miles Davis 1926 USA נתונות שתי טבלאות קל לאחד "לאורך" טבלאות עם אותו סדר עמודות, ע"י הפונקציה :bind_rows > bind_rows(musicians.1, musicians.2) # A tibble: 4 x 3 name yr.birth cntry <chr> <dbl> <chr> 1 John Lennon 1940 UK 2 Stevie Wonder 1950 USA 3 Beyonce 1981 USA 4 Miles Davis 1926 USA R חלק 10 R חלק 10 ב' תש"ף, 51 2019/20 52
איחוד טבלאות טבלאות איחוד > musicians.3 # A tibble: 3 x 2 name sex <chr> <chr> 1 John Lennon M 2 Stevie Wonder M 3 Beyonce F > bind_cols(musicians.1, musicians.3) # A tibble: 3 x 5 name yr.birth cntry name1 sex <chr> <dbl> <chr> <chr> <chr> 1 John Lennon 1940 UK John Lennon M 2 Stevie Wonder 1950 USA Stevie Wonder M 3 Beyonce 1981 USA Beyonce F חלק 10 איך מאחדים "לרוחב"? R > bind_cols(musicians.1, select(musicians.3, sex)) # A tibble: 3 x 4 name yr.birth cntry sex <chr> <dbl> <chr> <chr> 1 John Lennon 1940 UK M 2 Stevie Wonder 1950 USA M 3 Beyonce 1981 USA F R חלק 10 ב' תש"ף, 53 2019/20 54 איחוד טבלאות איחוד טבלאות > musicians.1 # A tibble: 3 x 3 name yr.birth cntry <chr> <dbl> <chr> 1 John Lennon 1940 UK 2 Stevie Wonder 1950 USA 3 Beyonce 1981 USA > musicians.4 # A tibble: 3 x 2 name sex <chr> <chr> 1 Beyonce F 2 John Lennon M 3 Stevie Wonder M איך מתמודדים עם סדר שורות שונה? R חלק 10 > left_join(musicians.1, musicians.4, by="name") # A tibble: 3 x 4 name yr.birth cntry sex <chr> <dbl> <chr> <chr> 1 John Lennon 1940 UK M 2 Stevie Wonder 1950 USA M 3 Beyonce 1981 USA F יש כמה סוגים של,join ואפשר לבצע אתם פעולות יותר מורכבות R חלק 10 ב' תש"ף, 55 2019/20 56