10 Tibblelar

10.1 Giriş

Bu kitap boyunca R’a ait klasik veri tabloları yerine “tibbler”lar ile çalışacağız. tibble’lar, hayatı biraz daha kolaylaştımak için bazı eski davranışları değiştiren veri tablolarıdır. R eski bir dildir ve 10-20 yıl öncesinde kullanışlı olan bazı şeyler şimdi işlerimizi zorlaştırabilir. Halihazırda var olan kodu bozmadan temel R üzerinde değişikilik yapmak zordur ve çoğu yenilik paketler aracılığıyla olur. Biz de tibble adlı, tidyverse’te çalışmayı biraz daha kolaylaştıran görüşlü (opinionated) veri tabloları sağlayan paketi tanıtacağız. Çoğu yerde tibble ve veri tablosu (dataframe) terimlerini dönüşümlü olarak kullanacağım; Özellikle R’da yerleşik olan veri tablosuna dikkat çekmek istediğimde data.frame diyeceğim.

Eğer bu bölümden sonra tibble’lar hakkında daha fazla şey öğrenmek isterseniz vignette("tibble") ilginizi çekebilir.

10.1.1 Ön koşullar

Bu bölümde temel tidyverse’in bir parçası olan tibble paketini keşfedeceğiz.

library(tidyverse)

10.2 Tibble oluşturmak

Bu kitapta yer alan tibble’ları üretmek için kullanacağınız neredeyse tüm fonskiyonlar, tıpkı tibble’lar gibi tidyverse’ün birleştirici özelliklerinden biridir. Diğer R paketlerinin çoğunluğu normal veri tablolarını kullanır, bu yüzden bir veri tablosunu tibble’a dönüşmeye zorlamak isteyebilirsiniz. Bunu as_tibble() ile 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 
#> # … with 144 more rows

tibble() ile bağımsız vektörlerden oluşan yeni bir tibble yapabilirsiniz. tibble(), otomatik olarak 1 uzunluğundaki girdileri dönüştürür ve aşağıda gösterildiği gibi az önce oluşturdğunuz değişkenlere atıfta bulunmanıza izin verir.

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

Halihazırda data.frame() fonksiyonuna aşinaysanız, tibble()’ın daha azını yaptığını unutmayın: hiç bir zaman girdilerin türünü değiitirmez (örneğin; dizileri faktötrlere dönüştürmez!), değişkenlerin isimlerini değiştirmez ve satır isimleri oluşturmaz.

Bir tibble, R’da geçerli olmayan yani sözdizimsel olmayan değişken isimlerine sahip sütun adlarına sahip olabilir. Örneğin; bir harfle başlamayabilirler ya da boşluk gibi farklı karakterler içerebilirler. Bu tip değişkenlere atıf yapmak için, değişkeni kesme işareti içine almanız gereklidir, `:

tb <- tibble(
  `:)` = "smile", 
  ` ` = "space",
  `2000` = "number"
)
tb
#> # A tibble: 1 × 3
#>   `:)`  ` `   `2000`
#>   <chr> <chr> <chr> 
#> 1 smile space number

Bu değiikenlerle ggplot2, dplyr, ve tidyr gibi başka paket programlarda çalışırken de kesme işareti kullanmanız gerekir.

tibble oluşturmanın bir diğer yolu transpoze tibble’ın kısaltması olan tribble() dır. tribble() koda veri girişi için uyarlanmıştır: sütun başlıkları formüller ile tanımlanır (örneğin; ~ile başlar) ve girdiler virgülle ayrılır. Bu küçük boyutlu verilerin kolayca okunabilecek şekilde düzenlenmesini sağlar.

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

Başlığın nerede olduğunu açıkça belirtmek için sıklıkla bir yorum (# ile başlayan bir satır) eklerim.

10.3 Tibble’lar veri tablolarına karşı

tibble ile klasik data.frame kullanımı arasında iki ana farklılık vardır: yazdırma ve alt kümeleme.

10.3.1 Yazdırma

tibble’lar sadece ilk 10 satırın gösterildiği ve bütün sütunları ekrana sığdıran, özelleştrilmiş bir yazdırma yöntemine sahiptir. Böylece büyük veriler ile çalışmayı kolaylaıtırır. str()’den alınan bir özellik olarak her sütun ismine ek olarak kendi veri tipini de gösterir:

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 2022-07-05 21:56:11 2022-07-12     1 0.368 n    
#> 2 2022-07-06 16:01:21 2022-07-17     2 0.612 l    
#> 3 2022-07-06 10:25:00 2022-07-27     3 0.415 p    
#> 4 2022-07-05 23:46:17 2022-07-26     4 0.212 m    
#> 5 2022-07-05 20:10:34 2022-07-23     5 0.733 i    
#> 6 2022-07-06 07:11:31 2022-07-19     6 0.460 n    
#> # … with 994 more rows

tibble’lar, büyük veri tabloları yazdırırken konsolunuzu yanlışlıkla boğmamanız için tasarlanmıştır. Ancak, bazen varsayılan göstergeden/ekrandan daha fazla çıktıya ihtiyacınız olabilir.

İlk olarak veri tablosunu açıkça print() ile yazdırabilir, satırların sayısını (n) ve göstergenin genişliğini kontrol edebilirainiz. width = Inf tüm sütunları gösterecektir:

nycflights13::flights %>% 
  print(n = 10, width = Inf)

Seçenekleri ayarlayarak varsayılan yazdırma işlemininin işleyişini de kontrol edebilirsiniz.

  • options(tibble.print_max = n, tibble.print_min = m): eğer n satırdan fazla satır varsa, sadece m kadar satırı yazdırır. Tüm satırları göstermek iöin options(tibble.print_min = Inf) kullanın.

  • Ekran genişliğine bağlı kalmaksızın her zaman tüm sütunları yazdırmak için options(tibble.width = Inf) kullançn.

Paket yardımına package?tibble ile bakarak seçeneklerin tam listesini görebilirsniniz.

Son seçenek olarak, tüm veri setinin kaydırılabilir görüntüsünü RStudio’da yerleşik olan veri görüntüleyeciyi kullanarak elde edebilirsiniz.

nycflights13::flights %>% 
  View()

10.3.2 Alt kümeleme

Buraya kadar öğrendiğiniz tüm araçlar tamamlanmış veri tabloları ile çalışıyordu. Eğer bir tek değişkeni seçmek isterseniz, yeni araçlara ihtiyacınız var, $ ve [[. [[ isme veya konuma göre; $ biraz daha az yazarak sadece isme göre seçebilir.

df <- tibble(
  x = runif(5),
  y = rnorm(5)
)

# isme göre seçme
df$x
#> [1] 0.7330 0.2344 0.6604 0.0329 0.4605
df[["x"]]
#> [1] 0.7330 0.2344 0.6604 0.0329 0.4605

# konuma göre seçme
df[[1]]
#> [1] 0.7330 0.2344 0.6604 0.0329 0.4605

Bunları bir pipe operatöründe kullanmak için, özel bir vekil kullanmanız gerekir .:

df %>% .$x
#> [1] 0.7330 0.2344 0.6604 0.0329 0.4605
df %>% .[["x"]]
#> [1] 0.7330 0.2344 0.6604 0.0329 0.4605

Bir data.frame ile karşılaştırıldığında, tibble’lar daha katıdır: asla kısmi eşleştirme yapmaz ve erişmeye çalıştığınız sütun eksikse ya da yoksa bir uyarı oluştururlar.

10.4 Eski kod ile ilişkilendirme

Bazı eski fonksiyonlar tibble’lar ile çalışmaz. Eğer yeni bir işleve rastlarsanız, tibble’ı tekrar veri tablosuna dönüştürmek için as.data.frame() i kullanın.

class(as.data.frame(tb))
#> [1] "data.frame"

Eski fonksiyonların tibble’lar ile birlikte çalışmamasının temel sebebi [ fonksiyonudur. bu kitapta[ fazla kullanılmadı çünkü dplyr::filter() ve dplyr::select() aynı problemleri daha temiz bir kodla çözmenize olanak tanır (ama vektör alt kümeleme kısmında birazını öğreneceksiniz.) temel R veri tabloları ile [ bazen tablosuna, bazen de vektöre dönüşür. tibble’lar ile ise [ her zaman bir başka tibble’a dönüşür.

10.5 Alıştırmalar

  1. Bir objenin tibble olduğunu nasıl söylersniniz? (İpucu: normal bir veri tablosu olan mtcarsı yazdırmayı deneyin.)

  2. Aşağıdaki işlemleri bir data.frame ve eşdeğer bir tibble üzerinde kıyaslayın ve karşılaştırın. Farklı olan nedir? Neden varsayılan veri tablosu işleyiş şekli sizi hayal kırıklığına uğratmış olabilir?

    df <- data.frame(abc = 1, xyz = "a")
    df$x
    df[, "xyz"]
    df[, c("abc", "xyz")]
  3. Objelerde saklanan bir değiikenin isimine sahipseniz, örenğin var <- "mpg" gibi, referans değişkeni tibble’dan nasıl seçersiniz?

  4. Aşağıdaki veri tablosu sözdizimine uygun olmayan isimleri kullanarak alıştırmaları yapın.

    1. 1 adlı değişkeni seçim.

    2. 1e 2’ yi gösteren bir dağılım grafiği çizdirin.

    3. 3 isminde, 2’nin 1e bölümü olan yeni bir sütun oluşturun.

    4. Sütunları one, two ve three olarak yeniden adlandırın.

    annoying <- tibble(
      `1` = 1:10,
      `2` = `1` * 2 + rnorm(length(`1`))
    )
  5. tibble::enframe() komutu ne yapar? Ne zaman kullanabilirsiniz?

  6. Hangi seçenek bir tibble’ın altbilgisinde kaç tane ek sütun isminin yazdırılacağını kontrol eder?