12  Listeler

Matrisler (Bölüm 9) ve veri çerçeveleri (Bölüm 10) derslerinde gördüğümüz veri yapıları, belirli bir düzende oluşturulabiliyordu. Yani bu veri yapılarının, belirli kısıtları bulunmaktaydı. Mesela bir grup vektörden veri çerçevesi oluşturmak istiyorsanız, vektörlerin uzunluklarının aynı olması gerekiyordu.

Listeler ise, farklı uzunluklarda ve tiplerde veri yapılarını kapsayabilme potansiyeline sahip.

12.1 Liste oluşturma

Şimdi gelin önceki derslerde oluşturduğumuz veri yapılarını tekrar oluşturalım ve bir liste içerisinde saklayalım.

Hayali veri setimizdeki bitkiler
Bitki İsmi Yaprak Uzunluğu (cm) Deney Koşulları
bitki1 2.3 Karanlık
bitki2 3.4 Aydınlık
bitki3 4.5 Aydınlık
bitki4 1.2 Karanlık
bitki5 3.4 Aydınlık
bitki6 - Karanlık
bitki7 1.8 Karanlık
bitki8 6.3 Aydinlik
bitki9 2.1 Karanlık
bitki10 - Karanlık

Öncelikle bir veri çerçevesi oluşturalım:

veri <- data.frame(bitki_ismi = c("bitki1", "bitki2", 
                                    "bitki3", "bitki4", 
                                    "bitki5", "bitki6", 
                                    "bitki7","bitki8", 
                                    "bitki9", "bitki10"),
                    yaprak_uzunlugu = c(2.3, 3.4, 4.5, 1.2, 3.4, 
                                            NA, 1.8, 6.3, 2.1, NA),
                    deney_kosullari = factor(c("karanlik", "aydinlik", 
                                                    "aydinlik", "karanlik", 
                                                    "aydinlik", "karanlik", 
                                                    "karanlik", "aydinlik", 
                                                    "karanlik", "karanlik"))
)

Şimdi de matrisler (Bölüm 9) dersinde oluşturduğumuz matrisi oluşturalım tekrar:

yaprak_uzunlugu <- c(2.3, 3.4, 4.5, 1.2, 3.4, 
                    3, 1.8, 6.3, 2.1, 5)

ornek_matris <- matrix(yaprak_uzunlugu, nrow=5, ncol=2)

Ek olarak bir tane de vektör oluşturalım:

isimler <- c("Ali", "Deniz", "Fatma", "Emre", "Volkan", "Onur")

Şimdi bütün bu bilgileri bir liste içerisinde toplayalım:

liste <- list(veri, ornek_matris, isimler)

Şimdi listeye bakalım:

liste
[[1]]
   bitki_ismi yaprak_uzunlugu deney_kosullari
1      bitki1             2.3        karanlik
2      bitki2             3.4        aydinlik
3      bitki3             4.5        aydinlik
4      bitki4             1.2        karanlik
5      bitki5             3.4        aydinlik
6      bitki6              NA        karanlik
7      bitki7             1.8        karanlik
8      bitki8             6.3        aydinlik
9      bitki9             2.1        karanlik
10    bitki10              NA        karanlik

[[2]]
     [,1] [,2]
[1,]  2.3  3.0
[2,]  3.4  1.8
[3,]  4.5  6.3
[4,]  1.2  2.1
[5,]  3.4  5.0

[[3]]
[1] "Ali"    "Deniz"  "Fatma"  "Emre"   "Volkan" "Onur"  

12.2 Listelerde indisleme

Listelerde indisleme biraz farklıdır.

Öncelikle elimizdeki listenin kaç tane eleman içerdiğine bakalım:

length(liste)
[1] 3

İstersek liste öğelerinin isimlerini inceleyebiliriz ya da isim atayabiliriz:

names(list)
NULL
liste <- list(veri=veri, ornek_matris = ornek_matris, isimler = isimler)
names(liste)
[1] "veri"         "ornek_matris" "isimler"     

Ya da şu şekilde atayabiliriz:

names(liste) <- c("veri", "ornek_matris", "isimler")

Listelerde indisleme yaparken iki farklı şekilde çalışabilirisniz. Ancak bu iki yöntem farklı veri yapıları geri döndürür:

  • Liste içindeki elemana erişim: [[]] doğrudan liste elemanını geri döndürür.
  • Liste’den yeni bir liste geri döndürmek: [] bize bir alt listeyi geri döndürdü.

12.2.1 Liste içindeki elemana erişme

İlk yöntem bize liste elemanlarına erişim ve bu elemanlar içinde işlem yapma olanağı sağlar.

liste[[3]]
[1] "Ali"    "Deniz"  "Fatma"  "Emre"   "Volkan" "Onur"  

Şimdi ise doğrudan vektörü geri döndürdük. Bu vektör içinde işlem yapabiliriz artık. Mesela bu vektörün ikinci elemanına erişebiliriz.

liste[[3]][2]
[1] "Deniz"

Bu sayede liste içindeki elemana ulaştık.

Şimdi birinci elemana erişelim:

liste[[1]]
   bitki_ismi yaprak_uzunlugu deney_kosullari
1      bitki1             2.3        karanlik
2      bitki2             3.4        aydinlik
3      bitki3             4.5        aydinlik
4      bitki4             1.2        karanlik
5      bitki5             3.4        aydinlik
6      bitki6              NA        karanlik
7      bitki7             1.8        karanlik
8      bitki8             6.3        aydinlik
9      bitki9             2.1        karanlik
10    bitki10              NA        karanlik

İstersek bu veri çerçevesi içinde işlemler yapabiliriz:

liste[[1]][4,2]
[1] 1.2

Eğer listemizin isimleri varsa doğruda bu isimleri kullanabiliriz:

liste$veri
   bitki_ismi yaprak_uzunlugu deney_kosullari
1      bitki1             2.3        karanlik
2      bitki2             3.4        aydinlik
3      bitki3             4.5        aydinlik
4      bitki4             1.2        karanlik
5      bitki5             3.4        aydinlik
6      bitki6              NA        karanlik
7      bitki7             1.8        karanlik
8      bitki8             6.3        aydinlik
9      bitki9             2.1        karanlik
10    bitki10              NA        karanlik

Bakın tekrar liste elemanına doğrudan eriştik. İstersek yukarıdaki işlemin aynısını yapabiliriz:

liste$veri[4,2]
[1] 1.2

12.2.2 Alt liste geri döndürme

Bu yöntemde elimizdeki listeden yeni bir alt liste oluşturuyoruz. Yani, indisleme yaptıktan sonra elde ettiğimiz veri yapısı da bir liste.

liste[3]
$isimler
[1] "Ali"    "Deniz"  "Fatma"  "Emre"   "Volkan" "Onur"  

Bu bize bir alt liste geri döndürdü. Ancak üçünücü eleman olan vektöre erişemiyoruz şu anda:

liste[3][2]
$<NA>
NULL

Bakın hata mesajı aldık. Çünkü elimizde bir alt liste var.

İstersek birden fazla liste elemanını seçebiliriz:

liste[1:2]
$veri
   bitki_ismi yaprak_uzunlugu deney_kosullari
1      bitki1             2.3        karanlik
2      bitki2             3.4        aydinlik
3      bitki3             4.5        aydinlik
4      bitki4             1.2        karanlik
5      bitki5             3.4        aydinlik
6      bitki6              NA        karanlik
7      bitki7             1.8        karanlik
8      bitki8             6.3        aydinlik
9      bitki9             2.1        karanlik
10    bitki10              NA        karanlik

$ornek_matris
     [,1] [,2]
[1,]  2.3  3.0
[2,]  3.4  1.8
[3,]  4.5  6.3
[4,]  1.2  2.1
[5,]  3.4  5.0

Şu örnekleri deneyin mutlaka:

Try these

liste[[2]]
liste[2]
liste[[2]][3]
liste[2][3]
liste[[1:3]]
liste[1:3]
liste[["isimler"]]
liste$isimler
liste["isimler"]

12.3 Sonuçlar

liste[[2]]
     [,1] [,2]
[1,]  2.3  3.0
[2,]  3.4  1.8
[3,]  4.5  6.3
[4,]  1.2  2.1
[5,]  3.4  5.0
liste[2]
$ornek_matris
     [,1] [,2]
[1,]  2.3  3.0
[2,]  3.4  1.8
[3,]  4.5  6.3
[4,]  1.2  2.1
[5,]  3.4  5.0
liste[[2]][3]
[1] 4.5
liste[2][3]
$<NA>
NULL
liste[[1:3]]
[1] 4.5
liste[1:3]
$veri
   bitki_ismi yaprak_uzunlugu deney_kosullari
1      bitki1             2.3        karanlik
2      bitki2             3.4        aydinlik
3      bitki3             4.5        aydinlik
4      bitki4             1.2        karanlik
5      bitki5             3.4        aydinlik
6      bitki6              NA        karanlik
7      bitki7             1.8        karanlik
8      bitki8             6.3        aydinlik
9      bitki9             2.1        karanlik
10    bitki10              NA        karanlik

$ornek_matris
     [,1] [,2]
[1,]  2.3  3.0
[2,]  3.4  1.8
[3,]  4.5  6.3
[4,]  1.2  2.1
[5,]  3.4  5.0

$isimler
[1] "Ali"    "Deniz"  "Fatma"  "Emre"   "Volkan" "Onur"  
liste[["isimler"]]
[1] "Ali"    "Deniz"  "Fatma"  "Emre"   "Volkan" "Onur"  
liste$isimler
[1] "Ali"    "Deniz"  "Fatma"  "Emre"   "Volkan" "Onur"  
liste["isimler"]
$isimler
[1] "Ali"    "Deniz"  "Fatma"  "Emre"   "Volkan" "Onur"