Veri bilimiyle uğraşan birçok insanın karşısında satırlar ve sütunlardan oluşan tablolar mevcut. Bu tabloları bazen API’lar, bazen Excel, csv, txt dosyaları, bazen de veri tabanları sayesinde elde ediyoruz (tabi sadece bunlarla da sınırlı değil). Bunlar kimi zaman düzenli, ama çoğu zaman düzenleme (temizlik) isteyen tablolar. Tidyverse de burada devreye giriyor:. Bize düzenlemeleri, görselleştirmeleri, modellemeleri kolay bir şekilde yapabilmemizi sağlayan, R’ın birçok paketini içinde bulunduran büyükçe bir paket. Hepsiyle beraber ve en önemlisi Tidyverse bize bir iş akışı (workflow) sunar. Veri bilimi ile uğraşanların sistematik bir şekilde ilerlemesine, işlemler arasında bağlantıların kolay kurulup anlaşılmasına yardımcı olur. Aşağıdaki şemada, tidyverse’ün sağladığı akışı ve kullanabileceğiniz bazı paketleri görebilirsiniz:
‘ggplot2’
‘tibble’
‘tidyr’
‘readr’
‘purrr’
‘dplyr’
‘stringr’
‘forcats’
‘lubridate’
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.2 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ ggplot2 3.4.2 ✔ tibble 3.2.1
## ✔ lubridate 1.9.2 ✔ tidyr 1.3.0
## ✔ purrr 1.0.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
dplyr, en yaygın veri işleme zorluklarını çözmenize yardımcı olan tutarlı bir fiil kümesi sağlayan bir veri işleme dilbilgisidir:
mutate()
varolan değişkenlerin fonksiyonları olan yeni değişkenler ekler
select()
değişkenleri adlarına göre seçer.
filter()
servis taleplerini değerlerine göre seçer.
summarise()
birden çok değeri tek bir özete indirger.
arrange()
satırların sırasını değiştirir.
library(dplyr)
library(nycflights13)
dplyr’in temel veri işleme fiillerini keşfetmek için . Bu veri çerçevesi, 336 yılında New York’tan kalkan 776.2013 uçuşun tümünü içermektedir. Veriler ABD Ulaştırma İstatistikleri Bürosu’ndan gelir.
flights
## # A tibble: 336,776 × 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 1 517 515 2 830 819
## 2 2013 1 1 533 529 4 850 830
## 3 2013 1 1 542 540 2 923 850
## 4 2013 1 1 544 545 -1 1004 1022
## 5 2013 1 1 554 600 -6 812 837
## 6 2013 1 1 554 558 -4 740 728
## 7 2013 1 1 555 600 -5 913 854
## 8 2013 1 1 557 600 -3 709 723
## 9 2013 1 1 557 600 -3 838 846
## 10 2013 1 1 558 600 -2 753 745
## # ℹ 336,766 more rows
## # ℹ 11 more variables: 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>
filter() gözlemleri
değerlerine göre alt kümelemenizi sağlar. İlk bağımsız değişken, veri
çerçevesinin adıdır. İkinci ve sonraki bağımsız değişkenler, veri
çerçevesini filtreleyen ifadelerdir. Örneğin, 1 Ocak’taki tüm uçuşları
aşağıdakilerle seçebiliriz:
filter(flights, month == 1, day == 1)
## # A tibble: 842 × 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 1 517 515 2 830 819
## 2 2013 1 1 533 529 4 850 830
## 3 2013 1 1 542 540 2 923 850
## 4 2013 1 1 544 545 -1 1004 1022
## 5 2013 1 1 554 600 -6 812 837
## 6 2013 1 1 554 558 -4 740 728
## 7 2013 1 1 555 600 -5 913 854
## 8 2013 1 1 557 600 -3 709 723
## 9 2013 1 1 557 600 -3 838 846
## 10 2013 1 1 558 600 -2 753 745
## # ℹ 832 more rows
## # ℹ 11 more variables: 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>
Bu kod satırını çalıştırdığınızda, dplyr filtreleme işlemini yürütür
ve yeni bir veri çerçevesi döndürür. dplyr işlevleri girişlerini asla
değiştirmez, bu nedenle sonucu kaydetmek istiyorsanız, atama işlecini
kullanmanız gerekir, :<-
jan1 <- filter(flights, month == 1, day == 1)
R, sonuçları yazdırır veya bir değişkene kaydeder. Her ikisini de yapmak istiyorsanız, ödevi parantez içinde alabilirsiniz:
(dec25 <- filter(flights, month == 12, day == 25))
## # A tibble: 719 × 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 12 25 456 500 -4 649 651
## 2 2013 12 25 524 515 9 805 814
## 3 2013 12 25 542 540 2 832 850
## 4 2013 12 25 546 550 -4 1022 1027
## 5 2013 12 25 556 600 -4 730 745
## 6 2013 12 25 557 600 -3 743 752
## 7 2013 12 25 557 600 -3 818 831
## 8 2013 12 25 559 600 -1 855 856
## 9 2013 12 25 559 600 -1 849 855
## 10 2013 12 25 600 600 0 850 846
## # ℹ 709 more rows
## # ℹ 11 more variables: 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>
Filtrelemeyi etkili bir şekilde kullanmak için, karşılaştırma işleçlerini kullanarak istediğiniz gözlemleri nasıl seçeceğinizi bilmeniz gerekir. R, standart paketi sağlar: ” < , <= , > , >= , != , == ”
R ile başlarken, yapılacak en kolay hata, eşitliği == kullanmak yerine = kullanmaktır. Bu durumda bilgilendirici bir hata alırsınız:
filter(flights, month ==1)
## # A tibble: 27,004 × 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 1 517 515 2 830 819
## 2 2013 1 1 533 529 4 850 830
## 3 2013 1 1 542 540 2 923 850
## 4 2013 1 1 544 545 -1 1004 1022
## 5 2013 1 1 554 600 -6 812 837
## 6 2013 1 1 554 558 -4 740 728
## 7 2013 1 1 555 600 -5 913 854
## 8 2013 1 1 557 600 -3 709 723
## 9 2013 1 1 557 600 -3 838 846
## 10 2013 1 1 558 600 -2 753 745
## # ℹ 26,994 more rows
## # ℹ 11 more variables: 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>
#> Error in `filter()`:
#> ! We detected a named input.
#> ℹ This usually means that you've used `=` instead of `==`.
#> ℹ Did you mean `month == 1`?
Kullanırken karşılaşabileceğiniz başka bir yaygın sorun ise işlem önceliğidir. Çıkan sonuçlar sizi şaşırtabilir!
sqrt(2) ^ 2 == 2
## [1] FALSE
#> [1] FALSE
1 / 49 * 49 == 1
## [1] FALSE
#> [1] FALSE
Bir satırın çıktıya dahil edilmesi için her ifadenin true olması
gerekir. Diğer kombinasyon türleri için Boole işleçlerini kendiniz
kullanmanız gerekir: “ve”, “veya” ve
“değil”. “& , | , !"
Aşağıdaki kod, Kasım veya Aralık ayında kalkan tüm uçuşları bulur:
filter(flights, month == 11 | month == 12)
## # A tibble: 55,403 × 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 11 1 5 2359 6 352 345
## 2 2013 11 1 35 2250 105 123 2356
## 3 2013 11 1 455 500 -5 641 651
## 4 2013 11 1 539 545 -6 856 827
## 5 2013 11 1 542 545 -3 831 855
## 6 2013 11 1 549 600 -11 912 923
## 7 2013 11 1 550 600 -10 705 659
## 8 2013 11 1 554 600 -6 659 701
## 9 2013 11 1 554 600 -6 826 827
## 10 2013 11 1 554 600 -6 749 751
## # ℹ 55,393 more rows
## # ℹ 11 more variables: 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>
R’nin karşılaştırmayı zorlaştırabilecek önemli bir özelliği, eksik değerler veya mevcut olmayan değerleridir. Bilinmeyen bir değeri temsil eder. ” NA ”
NA > 5
## [1] NA
#> [1] NA
10 == NA
## [1] NA
#> [1] NA
NA + 10
## [1] NA
#> [1] NA
NA / 2
## [1] NA
#> [1] NA
En kafa karıştırıcı sonuç şudur:
NA == NA
## [1] NA
#> [1] NA
Bunun neden doğru olduğunu biraz daha bağlamla anlamak en kolay yoldur:
#Mary'nin yaşı x olsun. Kaç yaşında olduğunu bilmiyoruz.
x <- NA
#y John'un yaşı olsun. Kaç yaşında olduğunu bilmiyoruz.
y <- NA
#John ve Mary aynı yaşta mı?
x == y
## [1] NA
#> [1] NA
#> Bilmiyoruz!
Bir değerin eksik olup olmadığını belirlemek istiyorsanız, şunu
kullanın:is.na()
is.na(x)
## [1] TRUE
#> [1] TRUE
Arrange(), satırları seçmek yerine sıralarını değiştirmesi dışında benzer şekilde çalışır. Sıralamak için bir veri çerçevesi ve bir dizi sütun adı (veya daha karmaşık ifadeler) gerekir. Birden fazla sütun adı sağlarsanız, her ek sütun, önceki sütunların değerlerindeki bağları koparmak için kullanılır: filter()
arrange(flights, year, month, day)
## # A tibble: 336,776 × 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 1 517 515 2 830 819
## 2 2013 1 1 533 529 4 850 830
## 3 2013 1 1 542 540 2 923 850
## 4 2013 1 1 544 545 -1 1004 1022
## 5 2013 1 1 554 600 -6 812 837
## 6 2013 1 1 554 558 -4 740 728
## 7 2013 1 1 555 600 -5 913 854
## 8 2013 1 1 557 600 -3 709 723
## 9 2013 1 1 557 600 -3 838 846
## 10 2013 1 1 558 600 -2 753 745
## # ℹ 336,766 more rows
## # ℹ 11 more variables: 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>
Bir sütuna göre azalan düzende yeniden sıralamak için kullanın: desc()
arrange(flights, desc(dep_delay))
## # A tibble: 336,776 × 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 9 641 900 1301 1242 1530
## 2 2013 6 15 1432 1935 1137 1607 2120
## 3 2013 1 10 1121 1635 1126 1239 1810
## 4 2013 9 20 1139 1845 1014 1457 2210
## 5 2013 7 22 845 1600 1005 1044 1815
## 6 2013 4 10 1100 1900 960 1342 2211
## 7 2013 3 17 2321 810 911 135 1020
## 8 2013 6 27 959 1900 899 1236 2226
## 9 2013 7 22 2257 759 898 121 1026
## 10 2013 12 5 756 1700 896 1058 2020
## # ℹ 336,766 more rows
## # ℹ 11 more variables: 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>
Eksik değerler her zaman sonunda sıralanır:
df <- tibble(x = c(5, 2, NA))
arrange(df, x)
## # A tibble: 3 × 1
## x
## <dbl>
## 1 2
## 2 5
## 3 NA
#> # A tibble: 3 × 1
#> x
#> <dbl>
#> 1 2
#> 2 5
#> 3 NA
arrange(df, desc(x))
## # A tibble: 3 × 1
## x
## <dbl>
## 1 5
## 2 2
## 3 NA
#> # A tibble: 3 × 1
#> x
#> <dbl>
#> 1 5
#> 2 2
#> 3 NA
Yüzlerce hatta binlerce değişkene sahip veri kümeleri almak nadir
değildir. Bu durumda, ilk zorluk genellikle gerçekten ilgilendiğiniz
değişkenleri daraltmaktır. değişkenlerin adlarına dayalı işlemleri
kullanarak kullanışlı bir alt kümeyi hızla sıralamanıza olanak tanır.select()
select(flights, year, month, day)
## # A tibble: 336,776 × 3
## year month day
## <int> <int> <int>
## 1 2013 1 1
## 2 2013 1 1
## 3 2013 1 1
## 4 2013 1 1
## 5 2013 1 1
## 6 2013 1 1
## 7 2013 1 1
## 8 2013 1 1
## 9 2013 1 1
## 10 2013 1 1
## # ℹ 336,766 more rows
select(flights, year:day)
## # A tibble: 336,776 × 3
## year month day
## <int> <int> <int>
## 1 2013 1 1
## 2 2013 1 1
## 3 2013 1 1
## 4 2013 1 1
## 5 2013 1 1
## 6 2013 1 1
## 7 2013 1 1
## 8 2013 1 1
## 9 2013 1 1
## 10 2013 1 1
## # ℹ 336,766 more rows
select(flights, -(year:day))
## # A tibble: 336,776 × 16
## dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier
## <int> <int> <dbl> <int> <int> <dbl> <chr>
## 1 517 515 2 830 819 11 UA
## 2 533 529 4 850 830 20 UA
## 3 542 540 2 923 850 33 AA
## 4 544 545 -1 1004 1022 -18 B6
## 5 554 600 -6 812 837 -25 DL
## 6 554 558 -4 740 728 12 UA
## 7 555 600 -5 913 854 19 B6
## 8 557 600 -3 709 723 -14 EV
## 9 557 600 -3 838 846 -8 B6
## 10 558 600 -2 753 745 8 AA
## # ℹ 336,766 more rows
## # ℹ 9 more variables: flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
select() değişkenleri
yeniden adlandırmak için kullanılabilir, ancak açıkça belirtilmeyen tüm
değişkenleri bıraktığı için nadiren kullanışlıdır. Bunun yerine, açıkça
belirtilmeyen tüm değişkenleri tutan bir varyant olan , rename()
kullanın:
rename(flights, tail_num = tailnum)
## # A tibble: 336,776 × 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 1 517 515 2 830 819
## 2 2013 1 1 533 529 4 850 830
## 3 2013 1 1 542 540 2 923 850
## 4 2013 1 1 544 545 -1 1004 1022
## 5 2013 1 1 554 600 -6 812 837
## 6 2013 1 1 554 558 -4 740 728
## 7 2013 1 1 555 600 -5 913 854
## 8 2013 1 1 557 600 -3 709 723
## 9 2013 1 1 557 600 -3 838 846
## 10 2013 1 1 558 600 -2 753 745
## # ℹ 336,766 more rows
## # ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
## # tail_num <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
## # hour <dbl>, minute <dbl>, time_hour <dttm>
mutate() Veri
kümenizin sonuna her zaman yeni sütunlar eklediğinden, yeni değişkenleri
görebilmemiz için daha dar bir veri kümesi oluşturarak başlayacağız.
RStudio’dayken, tüm sütunları görmenin en kolay yolu View().
flights_sml <- select(flights,
year:day,
ends_with("delay"),
distance,
air_time
)
mutate(flights_sml,
gain = dep_delay - arr_delay,
speed = distance / air_time * 60
)
## # A tibble: 336,776 × 9
## year month day dep_delay arr_delay distance air_time gain speed
## <int> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2013 1 1 2 11 1400 227 -9 370.
## 2 2013 1 1 4 20 1416 227 -16 374.
## 3 2013 1 1 2 33 1089 160 -31 408.
## 4 2013 1 1 -1 -18 1576 183 17 517.
## 5 2013 1 1 -6 -25 762 116 19 394.
## 6 2013 1 1 -4 12 719 150 -16 288.
## 7 2013 1 1 -5 19 1065 158 -24 404.
## 8 2013 1 1 -3 -14 229 53 11 259.
## 9 2013 1 1 -3 -8 944 140 5 405.
## 10 2013 1 1 -2 8 733 138 -10 319.
## # ℹ 336,766 more rows
Yeni oluşturduğunuz sütunlara başvurabileceğinizi unutmayın:
mutate(flights_sml,
gain = dep_delay - arr_delay,
hours = air_time / 60,
gain_per_hour = gain / hours
)
## # A tibble: 336,776 × 10
## year month day dep_delay arr_delay distance air_time gain hours
## <int> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2013 1 1 2 11 1400 227 -9 3.78
## 2 2013 1 1 4 20 1416 227 -16 3.78
## 3 2013 1 1 2 33 1089 160 -31 2.67
## 4 2013 1 1 -1 -18 1576 183 17 3.05
## 5 2013 1 1 -6 -25 762 116 19 1.93
## 6 2013 1 1 -4 12 719 150 -16 2.5
## 7 2013 1 1 -5 19 1065 158 -24 2.63
## 8 2013 1 1 -3 -14 229 53 11 0.883
## 9 2013 1 1 -3 -8 944 140 5 2.33
## 10 2013 1 1 -2 8 733 138 -10 2.3
## # ℹ 336,766 more rows
## # ℹ 1 more variable: gain_per_hour <dbl>
Yalnızca yeni değişkenleri korumak istiyorsanız, şunu kullanın:transmute()
transmute(flights,
gain = dep_delay - arr_delay,
hours = air_time / 60,
gain_per_hour = gain / hours
)
## # A tibble: 336,776 × 3
## gain hours gain_per_hour
## <dbl> <dbl> <dbl>
## 1 -9 3.78 -2.38
## 2 -16 3.78 -4.23
## 3 -31 2.67 -11.6
## 4 17 3.05 5.57
## 5 19 1.93 9.83
## 6 -16 2.5 -6.4
## 7 -24 2.63 -9.11
## 8 11 0.883 12.5
## 9 5 2.33 2.14
## 10 -10 2.3 -4.35
## # ℹ 336,766 more rows
Bir veri çerçevesini tek bir satıra daraltır:summarise()
summarise(flights, delay = mean(dep_delay, na.rm = TRUE))
## # A tibble: 1 × 1
## delay
## <dbl>
## 1 12.6
summarise() ile
eşleştirmediğimiz sürece çok yararlı değildir. Bu, analiz birimini tam
veri kümesinden tek tek gruplara değiştirir. Ardından, dplyr fiillerini
gruplandırılmış bir veri çerçevesinde kullandığınızda, bunlar otomatik
olarak “gruba göre” uygulanır. Örneğin, tarihe göre gruplandırılmış bir
veri çerçevesine tam olarak aynı kodu uygularsak, tarih başına ortalama
gecikme süresini alırız:group_by()
by_day <- group_by(flights, year, month, day)
summarise(by_day, delay = mean(dep_delay, na.rm = TRUE))
## `summarise()` has grouped output by 'year', 'month'. You can override using the
## `.groups` argument.
## # A tibble: 365 × 4
## # Groups: year, month [12]
## year month day delay
## <int> <int> <int> <dbl>
## 1 2013 1 1 11.5
## 2 2013 1 2 13.9
## 3 2013 1 3 11.0
## 4 2013 1 4 8.95
## 5 2013 1 5 5.73
## 6 2013 1 6 7.15
## 7 2013 1 7 5.42
## 8 2013 1 8 2.55
## 9 2013 1 9 2.28
## 10 2013 1 10 2.84
## # ℹ 355 more rows
#> `summarise()` has grouped output by 'year', 'month'. You can override using the
#> `.groups` argument.
#> # A tibble: 365 × 4
#> # Groups: year, month [12]
#> year month day delay
#> <int> <int> <int> <dbl>
#> 1 2013 1 1 11.5
#> 2 2013 1 2 13.9
#> 3 2013 1 3 11.0
#> 4 2013 1 4 8.95
#> 5 2013 1 5 5.73
#> 6 2013 1 6 7.15
#> # … with 359 more rows
Bu bölüm, ggplot2 kullanarak verilerinizi nasıl görselleştireceğinizi öğretecektir. R, grafik yapmak için çeşitli sistemlere sahiptir, ancak ggplot2 en zarif ve en çok yönlü olanlardan biridir. ggplot2, grafikleri tanımlamak ve oluşturmak için tutarlı bir sistem olan grafiklerin dilbilgisini uygular. ggplot2 ile, bir sistemi öğrenerek ve birçok yerde uygulayarak daha hızlı yapabilirsiniz.
library(ggplot2)
Kullanılan formüllerden bazıları şu şekildedir;
x ve y: grafiği çizilimek istenen veri setleri
xlab: yatay eksen adı
ylab: dikey eksen adı
glab: grup adı
main: grafik adı
distribution: verilerin istatistiksel dağılım türü
layout: 1’den fazla grafik çizilecekse bunların bir vektör veya matris formunda görüntülenebilmesini sağlar.
formula: faktör seviyelerine göre içindeki değişkenin grafiği
ylim: dikey eksen için sınırlar
xlim: yatay eksen için sınırlar
col: verileri gösteren noktaların rengi
col.lines: grafiği oluşturan çizgilerin rengi
pch: verileri gösteren noktaların şekli
cex: verileri gösteren noktaların boyutu
lwd: grafik çizgisinin genişliği
grid: grafik gri arka plan üzerine çizdirilir.
R üzerinde kurulum ile birlikte gelen bazı veri setleri de bulunmaktadır. Bu varsayılan olarak gelen veri setleri data() fonksiyonu görüntülenebilir.
Cevabınızı ggplot2’de (aka ) bulunan veri çerçevesi ile test edebilirsiniz. Veri çerçevesi, değişkenlerin (sütunlarda) ve gözlemlerin (satırlarda) dikdörtgen bir koleksiyonudur. ABD Çevre Koruma Ajansı tarafından 38 otomobil modeli üzerinde toplanan gözlemleri içerir.
Bu veriler, tarafımdan “https://r4ds.had.co.nz/index.html” kitabından alınmıştır.
mpg
## # A tibble: 234 × 11
## manufacturer model displ year cyl trans drv cty hwy fl class
## <chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
## 1 audi a4 1.8 1999 4 auto… f 18 29 p comp…
## 2 audi a4 1.8 1999 4 manu… f 21 29 p comp…
## 3 audi a4 2 2008 4 manu… f 20 31 p comp…
## 4 audi a4 2 2008 4 auto… f 21 30 p comp…
## 5 audi a4 2.8 1999 6 auto… f 16 26 p comp…
## 6 audi a4 2.8 1999 6 manu… f 18 26 p comp…
## 7 audi a4 3.1 2008 6 auto… f 18 27 p comp…
## 8 audi a4 quattro 1.8 1999 4 manu… 4 18 26 p comp…
## 9 audi a4 quattro 1.8 1999 4 auto… 4 16 25 p comp…
## 10 audi a4 quattro 2 2008 4 manu… 4 20 28 p comp…
## # ℹ 224 more rows
#> # A tibble: 234 × 11
#> manufacturer model displ year cyl trans drv cty hwy fl class
#> <chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
#> 1 audi a4 1.8 1999 4 auto(l5) f 18 29 p compa…
#> 2 audi a4 1.8 1999 4 manual(m5) f 21 29 p compa…
#> 3 audi a4 2 2008 4 manual(m6) f 20 31 p compa…
#> 4 audi a4 2 2008 4 auto(av) f 21 30 p compa…
#> 5 audi a4 2.8 1999 6 auto(l5) f 16 26 p compa…
#> 6 audi a4 2.8 1999 6 manual(m5) f 18 26 p compa…
#> # … with 228 more rows
Değişkenler arasında:mpg
displ, bir otomobilin litre cinsinden motor
boyutu.
hwy, bir otomobilin otoyoldaki yakıt verimliliği,
galon başına mil (mpg) cinsinden hesaplanır. Aynı mesafeyi
katettiklerinde, düşük yakıt verimliliğine sahip bir otomobil, yüksek
yakıt verimliliğine sahip bir otomobilden daha fazla yakıt
tüketir.
Grafik çizmek için, x eksenine ve y eksenine koymak için bu kodu çalıştırın:
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy))
Grafik, motor hacmi () ile yakıt verimliliği () arasında negatif bir ilişki olduğunu göstermektedir. Başka bir deyişle, büyük motorlu arabalar daha fazla yakıt kullanır. Bu, yakıt verimliliği ve motor büyüklüğü hakkındaki hipotezinizi doğruluyor mu yoksa çürütüyor mu?
ggplot2 ile, fonksiyonla bir çizime başlarsınız. Katman ekleyebileceğiniz bir koordinat sistemi oluşturur.İlk bağımsız değişkeni, grafikte kullanılacak veri kümesidir. Böylece boş bir grafik oluşturur, ancak çok ilginç olmadığı için burada göstermeyeceğim.
Grafiğinizdeki estetiği veri kümenizdeki değişkenlerle eşleyerek verilerinizle ilgili bilgileri aktarabilirsiniz. Örneğin, her arabanın sınıfını ortaya çıkarmak için puanlarınızın renklerini değişkenle eşleştirebilirsiniz.
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy, color = class))
Yukarıdaki örnekte, renk estetiğine eşledik, ancak boyut estetiğine aynı şekilde eşleyebilirdik. Bu durumda, her bir noktanın tam büyüklüğü sınıf ilişkisini ortaya çıkaracaktır. Burada bir uyarı alıyoruz, çünkü sıralanmamış bir değişkeni () sıralı bir estetiğe () eşlemek iyi bir fikir değildir.
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy, size = class))
## Warning: Using size for a discrete variable is not advised.
#> Warning: Using size for a discrete variable is not advised.
Geomunuzun estetik özelliklerini manuel olarak da ayarlayabilirsiniz. Örneğin, arsamızdaki tüm noktaları mavi yapabiliriz:
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy), color = "blue")
Bu iki çizim nasıl benzer ?
Her iki grafik de aynı x değişkenini, aynı y değişkenini içerir ve her ikisi de aynı verileri tanımlar. Ancak çizimler aynı değildir. Her grafik, verileri temsil etmek için farklı bir görsel nesne kullanır. ggplot2 sözdiziminde, farklı geomlar kullandıklarını söylüyoruz.
Geom, bir grafiğin verileri temsil etmek için kullandığı geometrik nesnedir. İnsanlar genellikle grafikleri, çizimleri kullandığı geom türüne göre tanımlar. Örneğin, çubuk grafikler çubuk geom’ları, çizgi grafikler çizgi geom’ları, boxplot’lar boxplot geom’ları kullanır vb. Dağılım grafikleri eğilimi kırar; nokta geomunu kullanırlar. Yukarıda gördüğümüz gibi, aynı verileri çizmek için farklı geomlar kullanabilirsiniz. yukarıdaki birinci grafik, nokta geomunu kullanır ve ikinci grafik, verilere takılı pürüzsüz bir çizgi olan pürüzsüz geom’u kullanır.
Grafiğinizdeki geom’u değiştirmek için, eklediğiniz geom fonksiyonunu değiştirin. Örneğin, yukarıdaki grafikleri yapmak için şu kodu kullanabilirsiniz:
# left
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy))
# right
ggplot(data = mpg) +
geom_smooth(mapping = aes(x = displ, y = hwy))
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
ggplot2’deki her geom fonksiyonu bir bağımsız değişken alır. Bununla birlikte, her estetik her geom ile çalışmaz. Bir noktanın şeklini ayarlayabilirsiniz, ancak bir çizginin “şeklini” ayarlayamazsınız. Öte yandan, bir çizginin çizgi türünü ayarlayabilirsiniz. , linetype ile eşlediğiniz değişkenin her benzersiz değeri için farklı bir linetype ile farklı bir çizgi çizecektir.
ggplot(data = mpg) +
geom_smooth(mapping = aes(x = displ, y = hwy, linetype = drv))
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
Aynı grafikte birden çok geom görüntülemek için, aşağıdakilere birden fazla geom fonksiyonu ekleyin:
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy)) +
geom_smooth(mapping = aes(x = displ, y = hwy))
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
Ancak bu, kodumuzda bazı çoğaltmalar getirir. Y eksenini yerine görüntülenecek şekilde değiştirmek isteyip istemediğinizi düşünün. Değişkeni iki yerde değiştirmeniz gerekir ve birini güncelleştirmeyi unutabilirsiniz. Bir dizi eşlemeyi . ggplot2, bu eşlemeleri grafikteki her bir geom için geçerli olan genel eşlemeler olarak ele alacaktır. Başka bir deyişle, bu kod önceki kodla aynı grafiği üretecektir:
ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) +
geom_point() +
geom_smooth()
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
Eşlemeleri bir geom işlevine yerleştirirseniz, ggplot2 bunları katman için yerel eşlemeler olarak ele alır. Bu eşlemeleri, yalnızca bu katman için genel eşlemeleri genişletmek veya üzerine yazmak için kullanır. Bu, farklı estetiği farklı katmanlarda sergilemeyi mümkün kılar.
ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) +
geom_point(mapping = aes(color = class)) +
geom_smooth()
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
Her katman için farklı belirtmek üzere aynı fikri kullanabilirsiniz. Burada, pürüzsüz çizgimiz veri kümesinin yalnızca bir alt kümesini, alt kompakt arabaları görüntüler. içindeki yerel veri bağımsız değişkeni, yalnızca bu katman için genel veri bağımsız değişkenini geçersiz kılar.
ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) +
geom_point(mapping = aes(color = class)) +
geom_smooth(data = filter(mpg, class == "subcompact"), se = FALSE)
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
Bir istatistiği açıkça kullanmanız gerekmesinin üç nedeni olabilir:
geom_bar()y�
değişken. Ne yazık ki, insanlar çubuk grafikler hakkında rasgele
konuştuklarında, çubuğun yüksekliğinin zaten olduğu bu çubuk grafik
türüne atıfta bulunur Verilerde veya önceki çubuk grafikte çubuğun
yüksekliğinin bulunduğu yerde bulunur satırların sayılmasıyla
oluşturulur.demo <- tribble(
~cut, ~freq,
"Fair", 1610,
"Good", 4906,
"Very Good", 12082,
"Premium", 13791,
"Ideal", 21551
)
ggplot(data = demo) +
geom_bar(mapping = aes(x = cut, y = freq), stat = "identity")
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, y = stat(prop), group = 1))
## Warning: `stat(prop)` was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(prop)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
#> Warning: `stat(prop)` was deprecated in ggplot2 3.4.0.
#> ℹ Please use `after_stat(prop)` instead.
ggplot(data = diamonds) +
stat_summary(
mapping = aes(x = cut, y = depth),
fun.min = min,
fun.max = max,
fun = median
)
Çubuk grafiklerle ilişkili bir sihir parçası daha var. Bir çubuk grafiği estetik veya daha kullanışlı bir şekilde kullanarak renklendirebilirsiniz:
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, colour = cut))
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, fill = cut))
Dolgu estetiğini başka bir değişkenle eşlerseniz ne olacağına dikkat edin, örneğin: çubuklar otomatik olarak istiflenir.
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, fill = clarity))
İstifleme, bağımsız değişken tarafından belirtilen konum ayarı ile otomatik olarak gerçekleştirilir. Yığılmış çubuk grafik istemiyorsanız, diğer üç seçenekten birini kullanabilirsiniz:
pozisyon = “kimlik”, her nesneyi grafik bağlamında tam olarak düştüğü yere yerleştirir. Bu, çubuklar için pek kullanışlı değildir çünkü üst üste biner. Üst üste binmeyi görmek için ya küçük bir değere ayarlayarak çubukları biraz şeffaf hale getirmemiz ya da ayarlayarak tamamen şeffaf hale getirmemiz gerekir.
ggplot(data = diamonds, mapping = aes(x = cut, fill = clarity)) +
geom_bar(alpha = 1/5, position = "identity")
ggplot(data = diamonds, mapping = aes(x = cut, colour = clarity)) +
geom_bar(fill = NA, position = "identity")
Kimlik konumu ayarı, noktalar gibi 2d geomlar için daha kullanışlıdır, burada varsayılan değerdir.
position = “fill”, istifleme gibi çalışır, ancak her bir istiflenmiş çubuk setini aynı yükseklikte yapar. Bu, gruplar arasında orantıları karşılaştırmayı kolaylaştırır.
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, fill = clarity), position = "fill")
position = “dodge”, üst üste binen nesneleri doğrudan yan yana yerleştirir. Bu, bireysel değerleri karşılaştırmayı kolaylaştırır.
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, fill = clarity), position = "dodge")
Koordinat sistemleri muhtemelen ggplot2’nin en karmaşık kısmıdır. Varsayılan koordinat sistemi, x ve y konumlarının her bir noktanın konumunu belirlemek için bağımsız olarak hareket ettiği Kartezyen koordinat sistemidir. Zaman zaman yardımcı olan bir dizi başka koordinat sistemi vardır.
coord_flip() x ve y eksenlerini değiştirir. Bu, örneğin yatay kutu grafikleri istiyorsanız kullanışlıdır. Uzun etiketler için de kullanışlıdır: x ekseninde üst üste binmeden sığdırmak zordur.
ggplot(data = mpg, mapping = aes(x = class, y = hwy)) +
geom_boxplot()
ggplot(data = mpg, mapping = aes(x = class, y = hwy)) +
geom_boxplot() +
coord_flip()
coord_quickmap(), haritalar için en boy oranını doğru ayarlar. Uzamsal verileri ggplot2 ile çiziyorsanız bu çok önemlidir0
coord_polar() kutupsal koordinatları kullanır. Kutupsal koordinatlar, bir çubuk grafik ile bir Coxcomb grafiği arasında ilginç bir bağlantı olduğunu ortaya koyuyor.
bar <- ggplot(data = diamonds) +
geom_bar(
mapping = aes(x = cut, fill = cut),
show.legend = FALSE,
width = 1
) +
theme(aspect.ratio = 1) +
labs(x = NULL, y = NULL)
bar + coord_flip()
bar + coord_polar()
R, sabit ve bilinen bir olası değerler kümesine sahip değişkenler olan kategorik değişkenleri işlemek için faktörleri kullanır. Faktörler, görüntüyü iyileştirmek için karakter vektörlerini yeniden sıralamak için de yararlıdır. Forcats paketinin amacı, düzeylerin sırasını veya değerleri değiştirmek de dahil olmak üzere faktörlerle ilgili yaygın sorunları çözen bir araç paketi sağlamaktır. Bazı örnekler şunlardır:
fct_reorder():
Bir faktörü başka bir değişkene göre yeniden sıralama.
fct_infreq():
Bir faktörü değerlerin sıklığına göre yeniden sıralama.
fct_relevel():
Bir faktörün sırasını elle değiştirme.
fct_lump():
Bir faktörün en az/en sık görülen değerlerini “diğer” olarak
daraltmak.
Ayı kaydeden bir değişkeniniz olduğunu düşünün:
x1 <- c("Dec", "Apr", "Jan", "Mar")
Bu değişkeni kaydetmek için bir dize kullanmanın iki sorunu vardır:
x2 <- c("Dec", "Apr", "Jam", "Mar")
sort(x1)
## [1] "Apr" "Dec" "Jan" "Mar"
#> [1] "Apr" "Dec" "Jan" "Mar"
Bu sorunların her ikisini de bir faktörle çözebilirsiniz. Bir faktör oluşturmak için geçerli seviyelerin bir listesini oluşturarak başlamalısınız:
month_levels <- c(
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
)
Şimdi bir faktör oluşturabilirsiniz:
y1 <- factor(x1, levels = month_levels)
y1
## [1] Dec Apr Jan Mar
## Levels: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
#> [1] Dec Apr Jan Mar
#> Levels: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
sort(y1)
## [1] Jan Mar Apr Dec
## Levels: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
#> [1] Jan Mar Apr Dec
#> Levels: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
Ve seviyede olmayan tüm değerler sessizce NA’ya dönüştürülecektir:
y2 <- factor(x2, levels = month_levels)
y2
## [1] Dec Apr <NA> Mar
## Levels: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
#> [1] Dec Apr <NA> Mar
#> Levels: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
Bu riskli görünüyor, bu yüzden bunun yerine forcats kullanmak isteyebilirsiniz:
y2 <- factor(x2, levels = month_levels)
#> Error in `fct()`:
#> ! All values of `x` must appear in `levels` or `na`
#> ℹ Missing level: "Jam"
Düzeyleri atlarsanız, verilerden alfabetik sırayla alınırlar.
factor(x1)
## [1] Dec Apr Jan Mar
## Levels: Apr Dec Jan Mar
#> [1] Dec Apr Jan Mar
#> Levels: Apr Dec Jan Mar
Alfabetik olarak sıralamak biraz risklidir, çünkü her bilgisayar dizeleri aynı şekilde sıralamaz. Yani ilk görünüşe göre siparişler:
fct(x1)
## [1] Dec Apr Jan Mar
## Levels: Dec Apr Jan Mar
#> [1] Dec Apr Jan Mar
#> Levels: Dec Apr Jan Mar
Geçerli düzeyler kümesine doğrudan erişmeniz gerekirse, bunu aşağıdakilerle yapabilirsiniz:
levels(y2)
## [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
#> [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
Readr ile verilerinizi okurken de bir faktör oluşturabilirsiniz:
csv <- "
month,value
Jan,12
Feb,56
Mar,12"
df <- read_csv(csv, col_types = cols(month = col_factor(month_levels)))
df$month
## [1] Jan Feb Mar
## Levels: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
#> [1] Jan Feb Mar
#> Levels: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
Bu bölümün geri kalanında, kullanacağız. Bu, Chicago Üniversitesi’ndeki bağımsız araştırma kuruluşu NORC tarafından yürütülen uzun süredir devam eden bir ABD anketi olan General Social Survey’den alınan bir veri örneğidir. Ankette binlerce soru var, bu yüzden Hadley’de faktörlerle çalışırken karşılaşacağınız bazı yaygın zorlukları gösterecek bir avuç soru seçti.
gss_cat
## # A tibble: 21,483 × 9
## year marital age race rincome partyid relig denom tvhours
## <int> <fct> <int> <fct> <fct> <fct> <fct> <fct> <int>
## 1 2000 Never married 26 White $8000 to 9999 Ind,near … Prot… Sout… 12
## 2 2000 Divorced 48 White $8000 to 9999 Not str r… Prot… Bapt… NA
## 3 2000 Widowed 67 White Not applicable Independe… Prot… No d… 2
## 4 2000 Never married 39 White Not applicable Ind,near … Orth… Not … 4
## 5 2000 Divorced 25 White Not applicable Not str d… None Not … 1
## 6 2000 Married 25 White $20000 - 24999 Strong de… Prot… Sout… NA
## 7 2000 Never married 36 White $25000 or more Not str r… Chri… Not … 3
## 8 2000 Divorced 44 White $7000 to 7999 Ind,near … Prot… Luth… NA
## 9 2000 Married 44 White $25000 or more Not str d… Prot… Other 0
## 10 2000 Married 47 White $25000 or more Strong re… Prot… Sout… 3
## # ℹ 21,473 more rows
#> # A tibble: 21,483 × 9
#> year marital age race rincome partyid
#> <int> <fct> <int> <fct> <fct> <fct>
#> 1 2000 Never married 26 White $8000 to 9999 Ind,near rep
#> 2 2000 Divorced 48 White $8000 to 9999 Not str republican
#> 3 2000 Widowed 67 White Not applicable Independent
#> 4 2000 Never married 39 White Not applicable Ind,near rep
#> 5 2000 Divorced 25 White Not applicable Not str democrat
#> 6 2000 Married 25 White $20000 - 24999 Strong democrat
#> # ℹ 21,477 more rows
#> # ℹ 3 more variables: relig <fct>, denom <fct>, tvhours <int>
Faktörler bir tibble içinde depolandığında, seviyelerini o kadar
kolay göremezsiniz. Bunları görüntülemenin bir yolu şudur:count()
gss_cat |>
count(race)
## # A tibble: 3 × 2
## race n
## <fct> <int>
## 1 Other 1959
## 2 Black 3129
## 3 White 16395
#> # A tibble: 3 × 2
#> race n
#> <fct> <int>
#> 1 Other 1959
#> 2 Black 3129
#> 3 White 16395
Bir görselleştirmedeki faktör düzeylerinin sırasını değiştirmek genellikle yararlıdır. Örneğin, dinler arasında günde TV izlemek için harcanan ortalama saat sayısını keşfetmek istediğinizi düşünün:
relig_summary <- gss_cat |>
group_by(relig) |>
summarize(
tvhours = mean(tvhours, na.rm = TRUE),
n = n()
)
ggplot(relig_summary, aes(x = tvhours, y = relig)) +
geom_point()
u komployu okumak zordur çünkü genel bir desen yoktur. Kullanım
düzeylerini yeniden sıralayarak geliştirebiliriz. üç argüman
alır:religfct_reorder()fct_reorder()
f, düzeylerini değiştirmek istediğiniz
faktör.
x, düzeyleri yeniden sıralamak için kullanmak
istediğiniz sayısal bir vektördür.
İsteğe bağlı olarak, ’nin her değeri için birden çok değer varsa
kullanılan bir işlevdir. Varsayılan değer şudur:
.funxfmedian
ggplot(relig_summary, aes(x = tvhours, y = fct_reorder(relig, tvhours))) +
geom_point()
Dini yeniden sıralamak, “Bilmiyorum” kategorisindeki insanların çok daha fazla TV izlediğini ve Hinduizm ve Diğer Doğu dinlerinin çok daha az izlediğini görmeyi çok daha kolay hale getirir.
Daha karmaşık dönüşümler yapmaya başladığınızda, bunları ayrı bir adımın dışına taşımanızı öneririz. Örneğin, yukarıdaki grafiği şu şekilde yeniden yazabilirsiniz:
relig_summary |>
mutate(
relig = fct_reorder(relig, tvhours)
) |>
ggplot(aes(x = tvhours, y = relig)) +
geom_point()
Ortalama yaşın bildirilen gelir seviyesine göre nasıl değiştiğine bakarak benzer bir çizim oluşturursak ne olur?
rincome_summary <- gss_cat |>
group_by(rincome) |>
summarize(
age = mean(age, na.rm = TRUE),
n = n()
)
ggplot(rincome_summary, aes(x = age, y = fct_reorder(rincome, age))) +
geom_point()
Bununla birlikte, diğer özel seviyelerle birlikte “Uygulanamaz” ı öne çekmek mantıklıdır. Şunları kullanabilirsiniz: . Bir faktör ve ardından çizginin önüne taşımak istediğiniz herhangi bir sayıda seviye alır.
ggplot(rincome_summary, aes(x = age, y = fct_relevel(rincome, "Not applicable"))) +
geom_point()
Başka bir yeniden sıralama türü, bir çizimdeki çizgileri renklendirirken kullanışlıdır. Faktörü en büyük değerlerle ilişkili değerlere göre yeniden sıralar. Bu, grafiğin okunmasını kolaylaştırır, çünkü grafiğin en sağındaki çizginin renkleri göstergeyle aynı hizada olacaktır.
by_age <- gss_cat |>
filter(!is.na(age)) |>
count(age, marital) |>
group_by(age) |>
mutate(
prop = n / sum(n)
)
ggplot(by_age, aes(x = age, y = prop, color = marital)) +
geom_line(linewidth = 1) +
scale_color_brewer(palette = "Set1")
ggplot(by_age, aes(x = age, y = prop, color = fct_reorder2(marital, age, prop))) +
geom_line(linewidth = 1) +
scale_color_brewer(palette = "Set1") +
labs(color = "marital")
Son olarak, çubuk grafikler için, seviyeleri azalan sıklıkta sıralamak için kullanabilirsiniz: bu, herhangi bir ekstra değişkene ihtiyaç duymadığı için en basit yeniden sıralama türüdür. Artan sıklıkta olmalarını istiyorsanız birleştirin, böylece çubuk grafikte en büyük değerler solda değil, sağda olur.
gss_cat |>
mutate(marital = marital |> fct_infreq() |> fct_rev()) |>
ggplot(aes(x = marital)) +
geom_bar()
Bir tibble veya , data.frame’in modern bir şekilde
yeniden tasarlanması, zamanın etkili olduğu kanıtlanan şeyleri tutmak ve
neyin olmadığını atmaktır. Tibble’lar tembel ve saçma sapan
data.frame’lerdir: daha az şey yaparlar (yani değişken adlarını veya
türlerini değiştirmezler ve kısmi eşleştirme yapmazlar) ve daha fazla
şikayet ederler (örneğin, bir değişken mevcut olmadığında). Bu, sizi
sorunlarla daha erken yüzleşmeye zorlar ve genellikle daha temiz, daha
etkileyici kodlara yol açar. Tibbles ayrıca karmaşık nesneler içeren
büyük veri kümeleriyle kullanımını kolaylaştıran gelişmiş bir print() yöntemine
sahiptir.
Bu kitapta kullanacağınız işlevlerin neredeyse tamamı tibbles üretir, çünkü tibbles tidyverse’in birleştirici özelliklerinden biridir. Diğer R paketlerinin çoğu normal veri çerçeveleri kullanır, bu nedenle bir veri çerçevesini bir tibble’a zorlamak isteyebilirsiniz. Bunu şu şekilde yapabilirsiniz:
as_tibble(iris)
## # A tibble: 150 × 5
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## <dbl> <dbl> <dbl> <dbl> <fct>
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
## 7 4.6 3.4 1.4 0.3 setosa
## 8 5 3.4 1.5 0.2 setosa
## 9 4.4 2.9 1.4 0.2 setosa
## 10 4.9 3.1 1.5 0.1 setosa
## # ℹ 140 more rows
ile tek tek vektörlerden yeni bir tibble oluşturabilirsiniz. 1 uzunluğundaki girişleri otomatik olarak geri dönüştürür ve aşağıda gösterildiği gibi yeni oluşturduğunuz değişkenlere başvurmanıza olanak tanır.
tibble(
x = 1:5,
y = 1,
z = x ^ 2 + y
)
## # A tibble: 5 × 3
## x y z
## <int> <dbl> <dbl>
## 1 1 1 2
## 2 2 1 5
## 3 3 1 10
## 4 4 1 17
## 5 5 1 26
Bir tibble’ın geçerli R değişken adları olmayan, diğer bir deyişle sözdizimsel olmayan adlar olan sütun adlarına sahip olması mümkündür. Örneğin, bir harfle başlamayabilir veya boşluk gibi sıra dışı karakterler içerebilirler. Bu değişkenlere başvurmak için, bunları ters tiklerle çevrelemeniz gerekir.
tb <- tibble(
`:)` = "smile",
` ` = "space",
`2000` = "number"
)
tb
## # A tibble: 1 × 3
## `:)` ` ` `2000`
## <chr> <chr> <chr>
## 1 smile space number
Bu değişkenlerle ggplot2, dplyr ve tidyr gibi diğer paketlerde çalışırken de ters işaretlere ihtiyacınız olacak.
tribble(
~x, ~y, ~z,
#--|--|----
"a", 2, 3.6,
"b", 1, 8.5
)
## # A tibble: 2 × 3
## x y z
## <chr> <dbl> <dbl>
## 1 a 2 3.6
## 2 b 1 8.5
Bir tibble ve data.frame kullanımında iki ana fark
vardır: baskı ve alt ayar.
Tibbles, yalnızca ilk 10 satırı ve ekrana sığan tüm sütunları gösteren rafine bir yazdırma yöntemine sahiptir. Bu, büyük verilerle çalışmayı çok daha kolay hale getirir. İsmine ek olarak, her sütun kendi türünü bildirir, ödünç alınan güzel bir özellik:
tibble(
a = lubridate::now() + runif(1e3) * 86400,
b = lubridate::today() + runif(1e3) * 30,
c = 1:1e3,
d = runif(1e3),
e = sample(letters, 1e3, replace = TRUE)
)
## # A tibble: 1,000 × 5
## a b c d e
## <dttm> <date> <int> <dbl> <chr>
## 1 2023-06-05 03:12:26 2023-06-29 1 0.359 u
## 2 2023-06-04 15:58:22 2023-07-02 2 0.788 x
## 3 2023-06-04 14:00:50 2023-06-07 3 0.171 j
## 4 2023-06-05 09:29:23 2023-06-09 4 0.464 i
## 5 2023-06-05 08:54:32 2023-06-27 5 0.488 m
## 6 2023-06-05 09:32:46 2023-06-19 6 0.593 g
## 7 2023-06-04 16:38:28 2023-06-06 7 0.464 p
## 8 2023-06-04 23:40:59 2023-06-04 8 0.815 o
## 9 2023-06-05 13:16:47 2023-06-16 9 0.656 i
## 10 2023-06-04 18:14:21 2023-06-26 10 0.688 q
## # ℹ 990 more rows
Tibble’lar, büyük veri çerçeveleri yazdırırken yanlışlıkla konsolunuzu bunaltmayacak şekilde tasarlanmıştır. Ancak bazen varsayılan ekrandan daha fazla çıktıya ihtiyacınız vardır. Yardımcı olabilecek birkaç seçenek vardır.
İlk olarak, veri çerçevesini açıkça belirtebilir ve satır sayısını () ve ekranı denetleyebilirsiniz. tüm sütunları görüntüler:
nycflights13::flights %>%
print(n = 10, width = Inf)
## # A tibble: 336,776 × 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 1 517 515 2 830 819
## 2 2013 1 1 533 529 4 850 830
## 3 2013 1 1 542 540 2 923 850
## 4 2013 1 1 544 545 -1 1004 1022
## 5 2013 1 1 554 600 -6 812 837
## 6 2013 1 1 554 558 -4 740 728
## 7 2013 1 1 555 600 -5 913 854
## 8 2013 1 1 557 600 -3 709 723
## 9 2013 1 1 557 600 -3 838 846
## 10 2013 1 1 558 600 -2 753 745
## arr_delay carrier flight tailnum origin dest air_time distance hour minute
## <dbl> <chr> <int> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 11 UA 1545 N14228 EWR IAH 227 1400 5 15
## 2 20 UA 1714 N24211 LGA IAH 227 1416 5 29
## 3 33 AA 1141 N619AA JFK MIA 160 1089 5 40
## 4 -18 B6 725 N804JB JFK BQN 183 1576 5 45
## 5 -25 DL 461 N668DN LGA ATL 116 762 6 0
## 6 12 UA 1696 N39463 EWR ORD 150 719 5 58
## 7 19 B6 507 N516JB EWR FLL 158 1065 6 0
## 8 -14 EV 5708 N829AS LGA IAD 53 229 6 0
## 9 -8 B6 79 N593JB JFK MCO 140 944 6 0
## 10 8 AA 301 N3ALAA LGA ORD 138 733 6 0
## time_hour
## <dttm>
## 1 2013-01-01 05:00:00
## 2 2013-01-01 05:00:00
## 3 2013-01-01 05:00:00
## 4 2013-01-01 05:00:00
## 5 2013-01-01 06:00:00
## 6 2013-01-01 05:00:00
## 7 2013-01-01 06:00:00
## 8 2013-01-01 06:00:00
## 9 2013-01-01 06:00:00
## 10 2013-01-01 06:00:00
## # ℹ 336,766 more rows
Son bir seçenek, tüm veri kümesinin kaydırılabilir bir görünümünü elde etmek için RStudio’nun yerleşik veri görüntüleyicisini kullanmaktır. Bu aynı zamanda uzun bir manipülasyon zincirinin sonunda da yararlıdır.
nycflights13::flights %>%
View()
Şimdiye kadar öğrendiğiniz tüm araçlar eksiksiz veri çerçeveleriyle çalıştı. Tek bir değişkeni çıkarmak istiyorsanız, bazı yeni araçlara ihtiyacınız var ve . isme veya pozisyona göre ayıklayabilir; sadece isme göre alıntılar, ancak biraz daha az yazar.
df <- tibble(
x = runif(5),
y = rnorm(5)
)
# Extract by name
df$x
## [1] 0.99686194 0.04338527 0.78141102 0.87829570 0.92080935
#> [1] 0.73296674 0.23436542 0.66035540 0.03285612 0.46049161
df[["x"]]
## [1] 0.99686194 0.04338527 0.78141102 0.87829570 0.92080935
#> [1] 0.73296674 0.23436542 0.66035540 0.03285612 0.46049161
# Extract by position
df[[1]]
## [1] 0.99686194 0.04338527 0.78141102 0.87829570 0.92080935
#> [1] 0.73296674 0.23436542 0.66035540 0.03285612 0.46049161
KAYNAKLAR : {#KAYNAKLAR style=“RED”}