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.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 rowstibble() 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 26Halihazı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 numberBu 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.5Baş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 rowstibble’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ğernsatırdan fazla satır varsa, sadecemkadar satırı yazdırır. Tüm satırları göstermek iöinoptions(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.4605Bunları 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.4605Bir 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
Bir objenin tibble olduğunu nasıl söylersniniz? (İpucu: normal bir veri tablosu olan
mtcarsı yazdırmayı deneyin.)Aşağıdaki işlemleri bir
data.frameve 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")]Objelerde saklanan bir değiikenin isimine sahipseniz, örenğin
var <- "mpg"gibi, referans değişkeni tibble’dan nasıl seçersiniz?Aşağıdaki veri tablosu sözdizimine uygun olmayan isimleri kullanarak alıştırmaları yapın.
1adlı değişkeni seçim.1e2’ yi gösteren bir dağılım grafiği çizdirin.3isminde,2’nin1e bölümü olan yeni bir sütun oluşturun.Sütunları
one,twovethreeolarak yeniden adlandırın.
annoying <- tibble( `1` = 1:10, `2` = `1` * 2 + rnorm(length(`1`)) )tibble::enframe()komutu ne yapar? Ne zaman kullanabilirsiniz?Hangi seçenek bir tibble’ın altbilgisinde kaç tane ek sütun isminin yazdırılacağını kontrol eder?