R Tidyverse

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:

  1. ‘ggplot2’

  2. ‘tibble’

  3. ‘tidyr’

  4. ‘readr’

  5. ‘purrr’

  6. ‘dplyr’

  7. ‘stringr’

  8. ‘forcats’

  9. ‘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 :

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)

NYCCflights13 :

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.

-Anket verileri R For Data Science kitabından alınmıştır.-
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>

1- Filter :

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>

-Karşılaştırmalar :

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

-Mantıksal işleçler :

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>

-Eksik değerler:

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

2- Arrange :

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

3- Select :

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>

4- Mutate :

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

5- Summarise :

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

GGPLOT2 :

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.

1- Veri çerçevesi :

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.

2- Bir ggplot oluşturma :

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")

3-Geometrik nesneler :

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'

4- İstatistiksel dönüşümler :

Bir istatistiği açıkça kullanmanız gerekmesinin üç nedeni olabilir:

  1. Varsayılan istatistiği geçersiz kılmak isteyebilirsiniz. Aşağıdaki kodda değiştiriyorum Sayımdan (varsayılan) kimliğe kadar olan istatistik. Bu izin verir Çubukların yüksekliğini bir 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")

  1. Dönüştürülmüş değişkenlerden varsayılan eşlemeyi geçersiz kılmak isteyebilirsiniz estetiğe yönelik. Örneğin, bir çubuk grafik saymak yerine oran görüntülemek isteyebilirsiniz :
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.
  1. İstatistiksel dönüşüme daha fazla dikkat çekmek isteyebilirsiniz kodunuzda bulabilirsiniz. Örneğin, , çizmek için her benzersiz x değeri için y değerlerini özetler.
ggplot(data = diamonds) + 
  stat_summary(
    mapping = aes(x = cut, y = depth),
    fun.min = min,
    fun.max = max,
    fun = median
  )

5- Konum ayarlamaları:

Ç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")

6- Koordinat sistemleri :

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()

FORCATS :

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.

1- Faktör temelleri :

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:

  1. Sadece on iki olası ay vardır ve sizi yazım hatalarından kurtaran hiçbir şey yoktur:
x2 <- c("Dec", "Apr", "Jam", "Mar")
  1. Kullanışlı bir şekilde sıralamaz:
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

2- Genel Sosyal Anket:

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.

-Anket verileri R For Data Science kitabından alınmıştır.-
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

3- Faktör sırasını değiştirme :

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()

TİBBLE :

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.

Tibbles oluşturma :

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

Tibbles ve data.frame karşılaştırması :

Bir tibble ve data.frame kullanımında iki ana fark vardır: baskı ve alt ayar.

1- Baskı :

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()

Alt Ayar :

Ş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