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"))
)
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.
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:
Şimdi de matrisler (Bölüm 9) dersinde oluşturduğumuz matrisi oluşturalım tekrar:
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:
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"