Listeler

Bir onceki yazida vektorlerin tek bir temel obje tipinden olustugunu soylemistik. Listeler bu acidan vektorlerden farklidir ve birden fazla obje tipini icerebilir.

Ilk olarak bir liste olusturalim:

> mylist=list(1,2,TRUE,'a')
> mylist
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] TRUE

[[4]]
[1] "a"

Gordugunuz gibi bu sefer vektorlerde karsilastigimiz tur donusturme davranisi ile karsilastirmadik ve her eleman onceki seklinde kaldi. Simdi listemizin 1. elemanina ulasalim:

> mylist[1]
[[1]]
[1] 1

Ama su anda hala 1. elemana ulasmadik, cunku listelerde her eleman bir tutucu olup her eleman icindeki degere ulasmak istiyorsak cift koseli parantez kullanmamiz gerekir. Farki daha iyi anlatabilmek adina:

> mylist[1]*5
Error in mylist[1] * 5 : non-numeric argument to binary operator
> class(mylist[1])
[1] "list"
> mylist[[1]]
[1] 1
> mylist[[1]]*5
[1] 5

Ilk olarak listemin birinci elemanina tek koseli parantez ile ulasabilecegimi varsayip 5 ile carpmaya calistim. Ancak hata aldim. class() fonksiyonunu kullanip gordum ki, tek koseli parantez kullandigimda elde ettigim hala bir liste. Listenin elemaninin icinde depolanan bilgiye erismek icinse iki tane koseli parantez kullandim ve bu durumda 5 ile carpabildim.

Diger ilk asamada cok bariz olmayan kimi ozelliklere bakalim. Ornegin, listemizin 4.elemanindan kurtulmak isteyelim:

> mylist[-4]
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] TRUE

Ya da

> mylist[1:3]
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] TRUE

Ancak farkettiginiz uzere 4.elemandan kurtulduktan sonra da hala liste elde ediyoruz. Ayni seyi cift koseli parantez kullanip bir vektor elde etmeye calisalim:

> mylist[[1:3]]
Error in mylist[[1:3]] : recursive indexing failed at level 2

Ise yaramadi. Peki bu ne demek, listeden asla vektor olusturamaz miyiz, hep liste olarak mi kalacak? Hayir bunun icin as.vector() fonksiyonunu kullanabiliriz.

> as.vector(mylist, mode='numeric')
[1] 1 2 1 NA
Warning message:
In as.vector(mylist, mode = "numeric") : NAs introduced by coercion
> as.vector(mylist, mode='character')
[1] "1" "2" "TRUE" "a"

Bu fonksiyonellikler olsa da cok kullanilmadigini soyleyebilirim. Her veri turunun kendine ozgu avantaj ve dezavantajlari var ve her tur veriyi icin belli veri tipleri daha uygun olacaktir. Genelde donusturmeler kimi fonksiyonlar sadece vektor, sadece liste tipinde objelerde calisiyorsa gerekli olabilir ancak onun disinda donusturmelerin cok kullanilmamasi daha iyi olur. Bunun bir sebebi de listelerin elemanlari tek elemandan olusmak zorunda degil. Su ornege bakalim:

> mylist2
[[1]]
[1] 0

[[2]]
[1] 1 2

[[3]]
[1] TRUE

[[4]]
[1] "a"

Bu ornekte, listemizin ikinci elemaninda iki elemanli bir vektor sakladik. Simdi az onceki yontemi kullanmaya kalkarsak:

> as.vector(mylist2, mode='numeric')
Error in as.vector(mylist2, mode = "numeric") : 
     (list) object cannot be coerced to type 'double'
> as.vector(mylist2, mode='character')
[1] "0" "c(1, 2)" "TRUE" "a"

Ikisi de bekledigimiz gibi bir sonuc degil, degil mi? Eger ki elde etmek istedigimiz vektor suna es degerse: c(“0″,”1″,”2″,”T”,”a”), unlist() fonksiyonunu kullanabiliriz. unlist() genellikle vektor yaratir:

> unlist(mylist2)
[1] "0" "1" "2" "TRUE" "a"

Simdi bir de vektorler uzerinde yaptigimiz islemler listeler uzerinde de gecerli mi ona kisaca goz atalim. Ilk olarak eslenik olarak degerlendirebilecegimiz bir vektor objesi (myvec) ve liste objesi (mylist) yaratalim:

> myvec=1:3
> myvec
[1] 1 2 3
> mylist=list(1,2,3)
> mylist
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

Vektorler konusunda gordugumuz kimi islemlerin uzerinden gecip, listeler uzerinde de gecerli mi simdi ona bakalim. Ilk olarak birlestirme islemi:

> c(myvec,myvec)
[1] 1 2 3 1 2 3
> c(mylist,mylist)
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

[[4]]
[1] 1

[[5]]
[1] 2

[[6]]
[1] 3

Yani evet listeleri de birlestirebiliyoruz! Peki aritmetik islemler?

> myvec * 3
[1] 3 6 9
> mylist * 3
Error in mylist * 3 : non-numeric argument to binary operator

Hayir, aritmetik islemleri yapabilmek icin listenin elemanlarina tek tek erismemiz gerekiyor.

Bir de isimlendirme islemlerine bakalim.

> names(myvec)=c('a','b','c')
> myvec
a b c 
1 2 3 
> names(mylist)=c('a','b','c')
> mylist
$a
[1] 1

$b
[1] 2

$c
[1] 3

Evet, isimlendirme de calisiyor. Peki isimli listede altkume alma islemleri nasil oluyor?

> myvec['a']
a 
1 
> mylist['a']
$a
[1] 1

> mylist[['a']]
[1] 1

Ayni indismis gibi isimleri kullanarak da liste elemanlarina ulasabiliyoruz. Ancak listelerde baska bir operator daha var bunun icin kullanabilecegimiz: $

> mylist$a
[1] 1

Ve bu operator cift koseli paranteze denk isliyor, gordugunuz gibi liste tipinde bir obje degil, direkt olarak ilk eleman icine kaydedilen bilgiye ulastik. Peki bu vektorlerde ise yaramiyor mu?

> myvec$a
Error in myvec$a : $ operator is invalid for atomic vectors

Hayir!


Yararli bulduysaniz lutfen ilgili ortamlarda paylasarak daha fazla kisiye ulasmasina yardimci olabilirsiniz. Ve hatta yorum / oneri / elestirileriniz icin asagiya yorum birakabilir, icerigin daha iyi olmasini saglayabilirsiniz! Paylasimlardan haberdar olmak icin blog’u takip etmeyi unutmayin!

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s