17 List

Farklı değişken tipleriyle vektör oluşturduğumuzda bu vektörlerin classları hangi değişken tipi baskınsa ona göre değişmişti. List ise farklı objeleri bir arada tutabileceğimiz yapıdır.

17.1 List Oluşturma

Teknik olarak list bir vektördür. Önceden gördüğümüz vektörler “atomik vektör” olarak da bilinir. List’e ise “yinelemeli” vektör denilebilir.

a <- list(1,2,3,4,5) ; a
## [[1]]
## [1] 1
## 
## [[2]]
## [1] 2
## 
## [[3]]
## [1] 3
## 
## [[4]]
## [1] 4
## 
## [[5]]
## [1] 5
b <- list(c(1,2,3,4,5)) ; b 
## [[1]]
## [1] 1 2 3 4 5
c <- list(sayilar=c(1,2,3,4,5)); c
## $sayilar
## [1] 1 2 3 4 5
isim <- c("ayşe","ali","fatma")
maas <- c(3000,2800,3200)
sendika <- c(T,F,T)

calisan <- listsim = isim, Maas = maas, Sendika = sendika)
calisan ; class(calisan)
## $İsim
## [1] "ayşe"  "ali"   "fatma"
## 
## $Maas
## [1] 3000 2800 3200
## 
## $Sendika
## [1]  TRUE FALSE  TRUE
## [1] "list"

17.2 Elemanlara Ulaşma

Oluşturulan list’in belli bir parçasına ulaşmak için “$” işareti kullanılabilir. Yada " [[ ]] " şeklinde iki tane köşeli parantez kullanılabilir.

calisan$Maas
## [1] 3000 2800 3200

List’de değiken tipleri değişmediği için, numeric olan bir parçasına istediğimiz matematiksel işlemleri uygulayabiliriz.

max(calisan$Maas)
## [1] 3200

[[]] kullanılırken içerisine ulaşmak istediğimiz değişkenin ismi tırnak içerisinde grilir ya da indexi sayı ile seçilir.

calisan[["İsim"]]; calisan[["Maas"]]; calisan[[2]]
## [1] "ayşe"  "ali"   "fatma"
## [1] 3000 2800 3200
## [1] 3000 2800 3200

Tek köşeli parantez kullanılırsa, değikenlere göre seçim yapar

calisan[1:2] 
## $İsim
## [1] "ayşe"  "ali"   "fatma"
## 
## $Maas
## [1] 3000 2800 3200
# isim, maas, sendika olarak indexlendiği için ilk 2 sine ulaştı

17.3 List’e Eleman Ekleme ve Silme

List oluşturuluken değikenlerin uzunlukları aynı olmak zorunda değildir

calisan$yenieleman <- c(1,2)
calisan
## $İsim
## [1] "ayşe"  "ali"   "fatma"
## 
## $Maas
## [1] 3000 2800 3200
## 
## $Sendika
## [1]  TRUE FALSE  TRUE
## 
## $yenieleman
## [1] 1 2
calisan[[5]] <- 5 ; calisan
## $İsim
## [1] "ayşe"  "ali"   "fatma"
## 
## $Maas
## [1] 3000 2800 3200
## 
## $Sendika
## [1]  TRUE FALSE  TRUE
## 
## $yenieleman
## [1] 1 2
## 
## [[5]]
## [1] 5
calisan[6:8] <- c(T,T,T) ; calisan
## $İsim
## [1] "ayşe"  "ali"   "fatma"
## 
## $Maas
## [1] 3000 2800 3200
## 
## $Sendika
## [1]  TRUE FALSE  TRUE
## 
## $yenieleman
## [1] 1 2
## 
## [[5]]
## [1] 5
## 
## [[6]]
## [1] TRUE
## 
## [[7]]
## [1] TRUE
## 
## [[8]]
## [1] TRUE

Silme işlemlerinde değişken yerine “NULL” ataması yapılır.

calisan[4:8] <- NULL; calisan
## $İsim
## [1] "ayşe"  "ali"   "fatma"
## 
## $Maas
## [1] 3000 2800 3200
## 
## $Sendika
## [1]  TRUE FALSE  TRUE

17.4 Listenin Uzunluğu

lenghth() fonksiyonu ile bulunabilir

length(calisan)
## [1] 3

Data frame’ler bir bakıma matrislere benzer, satır ve sütunlardan oluşurlar. Matrislerin aksine bir data frame farklı değişken tiplerini içinde barındırabilir. Örneğin bir sütunda kişilerin numeric değerler bir diğerinde ise string değerler bulunabilir. List’in iki boyutlu hali olarak düşünülebilir. Data frame’lerde değişkenlerin gözlem değerlerinin aynı sayıda olmasıdır.

17.5 Data Frame Oluşturma

Data frame oluşturmak için data.frame() fonksiyonu kullanılabilir.

isimler <- c("ali","ayşe","mehmet")
yaşlar <- c(22,20,19)
df <- data.frame(isimler,yaşlar)
df
##   isimler yaşlar
## 1     ali     22
## 2    ayşe     20
## 3  mehmet     19

17.6 Değerlere Erişmek

List’de olduğu [[]] ya da $ işaretleri kullanılabilir.

df[[1]]
## [1] ali    ayşe   mehmet
## Levels: ali ayşe mehmet
df$isimler
## [1] ali    ayşe   mehmet
## Levels: ali ayşe mehmet

Bir diğer yöntem ise matrislerdeki gibi tek parantez kullanmaktır. Genel olarak bu yöntem kullanılmaktadır.

df[,1]
## [1] ali    ayşe   mehmet
## Levels: ali ayşe mehmet

str() fonksiyonu ile data frame’i inceleyebiliriz.

str(df)
## 'data.frame':    3 obs. of  2 variables:
##  $ isimler: Factor w/ 3 levels "ali","ayşe","mehmet": 1 2 3
##  $ yaşlar : num  22 20 19

17.7 Alt Data Frame’ler Oluşturma

17.7.1 Veriyi Oluşturma

notlar <- 39:61
durum <- c(rep("kaldi",11),rep("gecti",12))
cinsiyet <- c("erkek","kadin")
cinsiyet <- sample(cinsiyet,23,replace=T)
df2  <- data.frame(Notlar = notlar, GecmeDurumu = durum, Cinsiyet = cinsiyet) ; head(df2)
##   Notlar GecmeDurumu Cinsiyet
## 1     39       kaldi    erkek
## 2     40       kaldi    erkek
## 3     41       kaldi    erkek
## 4     42       kaldi    kadin
## 5     43       kaldi    kadin
## 6     44       kaldi    erkek
df2[3:8,c(1,3)]
##   Notlar Cinsiyet
## 3     41    erkek
## 4     42    kadin
## 5     43    kadin
## 6     44    erkek
## 7     45    erkek
## 8     46    kadin

Notları 43’den büyük olanlar

df2[df2$Notlar >= 43,]
##    Notlar GecmeDurumu Cinsiyet
## 5      43       kaldi    kadin
## 6      44       kaldi    erkek
## 7      45       kaldi    erkek
## 8      46       kaldi    kadin
## 9      47       kaldi    erkek
## 10     48       kaldi    erkek
## 11     49       kaldi    kadin
## 12     50       gecti    kadin
## 13     51       gecti    kadin
## 14     52       gecti    erkek
## 15     53       gecti    erkek
## 16     54       gecti    kadin
## 17     55       gecti    kadin
## 18     56       gecti    kadin
## 19     57       gecti    kadin
## 20     58       gecti    erkek
## 21     59       gecti    erkek
## 22     60       gecti    erkek
## 23     61       gecti    erkek
df2[5,1] <- NA; head(df2) # head fonksiyonu ilk 6 veriyi görmemizi sağlar.
##   Notlar GecmeDurumu Cinsiyet
## 1     39       kaldi    erkek
## 2     40       kaldi    erkek
## 3     41       kaldi    erkek
## 4     42       kaldi    kadin
## 5     NA       kaldi    kadin
## 6     44       kaldi    erkek

Matematiksel işlemler data framelerin numeric değerlerine de uygulanabilir.

mean(df2$Notlar);mean(df2$Notlar, na.rm=T)
## [1] NA
## [1] 50.31818

Altküme oluşturmak için subset() fonksiyonu kullanılabilir.

subset(df2, Notlar > 46)
##    Notlar GecmeDurumu Cinsiyet
## 9      47       kaldi    erkek
## 10     48       kaldi    erkek
## 11     49       kaldi    kadin
## 12     50       gecti    kadin
## 13     51       gecti    kadin
## 14     52       gecti    erkek
## 15     53       gecti    erkek
## 16     54       gecti    kadin
## 17     55       gecti    kadin
## 18     56       gecti    kadin
## 19     57       gecti    kadin
## 20     58       gecti    erkek
## 21     59       gecti    erkek
## 22     60       gecti    erkek
## 23     61       gecti    erkek
subset(df2, Cinsiyet == "kadin")
##    Notlar GecmeDurumu Cinsiyet
## 4      42       kaldi    kadin
## 5      NA       kaldi    kadin
## 8      46       kaldi    kadin
## 11     49       kaldi    kadin
## 12     50       gecti    kadin
## 13     51       gecti    kadin
## 16     54       gecti    kadin
## 17     55       gecti    kadin
## 18     56       gecti    kadin
## 19     57       gecti    kadin

17.8 Data Frameleri Birleştirmek

merge() fonksiyonu ile data frameler birleştirilebilir.

isimler <- c("ali","ayse","mehmet","fatma")
isimler1 <- c("ali","ayse","fatma")
boy <-c(170,180,155,150)
kilo <- c(80,70,59)
d1 <- data.framesim = isimler,Boy= boy)
d2 <- data.framesim = isimler1,Kilo = kilo)
d1;d2
##     İsim Boy
## 1    ali 170
## 2   ayse 180
## 3 mehmet 155
## 4  fatma 150
##    İsim Kilo
## 1   ali   80
## 2  ayse   70
## 3 fatma   59
d4 <- merge(d1,d2);d4
##    İsim Boy Kilo
## 1   ali 170   80
## 2  ayse 180   70
## 3 fatma 150   59
d3 <- data.framesim = isimler1, ID = 1:3)
merge(d4,d3) ; d4;d3
##    İsim Boy Kilo ID
## 1   ali 170   80  1
## 2  ayse 180   70  2
## 3 fatma 150   59  3
##    İsim Boy Kilo
## 1   ali 170   80
## 2  ayse 180   70
## 3 fatma 150   59
##    İsim ID
## 1   ali  1
## 2  ayse  2
## 3 fatma  3