İnsanların uzun formattaki veriyi (buna "uzun form" denir; ne anlama geldiği birazdan netleşecek) geniş formata ve tersini dönüştürmesi gereken zamanlar olur. Gerçek hayatta veri her türlü formatta gelir, ancak R fonksiyonlarının çoğu belirli bir form için tasarlanmıştır.
Örneğin, karma doğrusal modelleme için lme4::lmer(), görselleştirme için ggplot2::ggplot() uzun form için tasarlanmıştır. Öte yandan mosaicplot() gibi geniş form için tasarlanmış fonksiyonlar da vardır. Bu da, verileriniz zaten işlenmiş ve doğru formda değilse analiz veya görselleştirme yapabilmek için formu dönüştürmeniz gerektiği anlamına gelir.
R'de format dönüşümü için birkaç seçenek vardır ancak yeni başlarken oldukça kafa karıştırıcı olabilir.
Bu eğitim, veriyi uzun form ile geniş form arasında dönüştürmenin mantığını anlamanızı sağlayacak. Aşağıdaki konuları inceleyeceksiniz:
Önce uzun form hakkında daha fazla bilgi edineceksiniz.
Ardından geniş formu tanıyacaksınız.
Uzun ve geniş formatlar arasındaki farkları gözden geçireceksiniz;
Sonrasında bir formdan diğerine geçmek için hangi adımların gerektiğini göreceksiniz.
Son olarak, tüm bunları R ile uygulayacaksınız. melt() ve dcast() fonksiyonlarıyla uzun formattan geniş formata nasıl geçileceğini öğreneceksiniz.
Veri
Tablo 01
name
gender
year2011
year2012
year2013
year2014
year2015
Jackson Smith
M
74.69
84.99
91.73
105.11
111.04
Sophia Johnson
F
NA
NA
NA
NA
75.89
Emma Williams
F
NA
NA
75.74
86.50
91.50
Aiden Jones
M
NA
NA
NA
71.89
81.42
Liam Brown
M
88.24
96.91
101.85
108.13
112.45
Lucas Davis
M
70.60
83.78
94.17
100.03
106.35
Olivia Miller
F
64.78
80.76
87.30
97.13
103.80
Ava Wilson
F
88.77
96.45
104.72
112.84
NA
Bu tablo küçük bir yerel bölgede bebeklerin boylarını göstermektedir. Boylar 2011 yılından 2015 yılına kadar ölçülmüştür. Muhtemelen bildiğiniz gibi, NA ‘Kayıt Yok’ anlamına gelir. NA’ların konumundan bebeklerin yaşlarını çıkarabilirsiniz, ancak tablodan bir bebeğin tam yaşı elde edilemez. Tablo düzenli görünüyor, ancak bebeklerin büyümesini incelemek isteyen herkes için bir sorun var: önemli olan bebeğin ölçüldüğü mutlak zaman değil, ölçüm anındaki yaşıdır. Bu bilgiyi tabloya ekleyebilir misiniz? Aşağıda bir yöntem görebilirsiniz:
Tablo 02
name
gender
age0
age1
age2
age3
age4
age5
age6
Jackson Smith
M
NA
76.69
84.91
97.06
105.73
107.32
NA
Sophia Johnson
F
NA
76.05
NA
NA
NA
NA
NA
Emma Williams
F
72.65
82.46
91.76
NA
NA
NA
NA
Aiden Jones
M
69.76
79.89
NA
NA
NA
NA
NA
Liam Brown
M
NA
NA
85.34
93.22
105.78
105.84
114.82
Lucas Davis
M
71.59
84.87
92.10
100.73
104.21
NA
NA
Olivia Miller
F
62.74
81.39
92.02
98.32
106.44
NA
NA
Ava Wilson
F
NA
NA
88.39
100.67
107.58
111.52
NA
NA sayısı arttı. ## Geniş Form Veri Peki bir bebeğin kaç aylık olduğunu aktarmak isteseydiniz ne yapardınız? Şuna benzer olurdu:
Tablo 03
name
gender
m4
m6
m7
m10
m12
...
m55
m60
m65
m72
Jackson Smith
M
NA
NA
NA
NA
76.69
...
NA
107.32
NA
NA
Sophia Johnson
F
NA
NA
NA
NA
76.05
...
NA
NA
NA
NA
Emma Williams
F
NA
NA
NA
72.65
NA
...
NA
NA
NA
NA
Aiden Jones
M
NA
69.76
NA
NA
NA
...
NA
NA
NA
NA
Liam Brown
M
NA
NA
NA
NA
NA
...
NA
105.84
NA
114.82
Lucas Davis
M
NA
NA
71.59
NA
NA
...
104.21
NA
NA
NA
Olivia Miller
F
62.74
NA
NA
NA
NA
...
NA
NA
NA
NA
Ava Wilson
F
NA
NA
NA
NA
NA
...
NA
NA
111.52
NA
Yukarıdaki tabloda tonla NA var. Bebeklerin göreli ölçüm zamanları farklıysa, geniş form çok fazla alan israf edebilir. Başka bir seçenek, 2015 yılında bebeklerin yaşlarını eklemek olabilir, ancak bu yalnızca mutlak ölçüm zamanları tamamen aynıysa mümkündür. Bebekler ölçüm zamanında aylara göre farklılık gösteriyorsa ve yaşları ay cinsinden bilmek istiyorsanız, bu işe yaramaz. O zaman bu örnek tek yol gibi görünüyor. Bu durumda uzun formu kullanmayı düşünebilirsiniz. ## Uzun Formda Veri Geniş formda bir bebeğe ait tüm ölçümler tek satırda gösterilirken, uzun formda bir satırda yalnızca bir bebeğe ait tek bir ölçüm görürsünüz. En basit yöntem, bir satırda çocuğun adını, ölçüm zamanını ve ölçümü (boy) göstermektir. Tam olarak bu tablo bunu gösteriyor:
Tablo 04
name
gender
month
height
Olivia Miller
F
4
62.74
Aiden Jones
M
6
69.76
Lucas Davis
M
7
71.59
Emma Williams
F
10
72.65
Jackson Smith
M
12
76.69
...
...
...
...
Liam Brown
M
72
114.82
Veriyi adlara göre sıralarsanız, aşağıdaki gibi bir tablo elde edersiniz. Açıkça görüldüğü gibi, bu tablo yukarıda gördüğünüz Tablo 3'ten daha az yer kaplar!
Tablo 05
name
gender
month
height
Jackson Smith
M
12
76.69
Jackson Smith
M
24
84.91
Jackson Smith
M
36
97.06
Jackson Smith
M
48
105.73
Jackson Smith
M
60
107.32
Sophia Johnson
F
12
76.05
Emma Williams
F
10
72.65
...
...
...
...
Ava Wilson
F
65
111.52
Uzun ve Geniş Karşılaştırması
Not: Geniş form ile uzun form arasındaki temel farkları yeniden hatırlayın: Basit bir fark şudur: geniş form bir bireye ait birçok ölçümü tek satırda gösterir ve sütun adları ölçümlerin ne olduğunu belirtir.
Bu tablo Liam Brown’ın 2011-2015 yıllarındaki boylarını tek satırda gösteriyor:
Tablo 06
name
gender
year2011
year2012
year2013
year2014
year2015
Liam Brown
M
88.24
96.91
101.85
108.13
112.45
Uzun formda ise Liam Brown'ın boyları tek bir sütunda gösterilir:
Tablo 07
name
gender
_
Liam Brown
M
85.34
Liam Brown
M
93.22
Liam Brown
M
105.78
Liam Brown
M
105.84
Liam Brown
M
114.82
Gördüğünüz gibi, ölçümlerin ne olduğunu bilemezsiniz. Sütun adını yazarsanız şöyle görünür:
Tablo 08
name
gender
year2011, 2012, 2013, 2014, 2015
Liam Brown
M
85.34
Liam Brown
M
93.22
Liam Brown
M
105.78
Liam Brown
M
105.84
Liam Brown
M
114.82
Ancak bunun da kendi sorunu var. Sophia Johnson’ın boyu 2011-2014 yıllarında ölçülmedi. Bu yüzden aşağıda gördüğünüz gibi sütun adını kolayca belirleyemezsiniz:
Tablo 09
name
gender
?
Liam Brown
M
85.34
Liam Brown
M
93.22
Liam Brown
M
105.78
Liam Brown
M
105.84
Liam Brown
M
114.82
Sophia Johnson
F
76.05
Geniş Formdan Uzun Forma
Geniş formu uzun forma dönüştürmek adım adım bir süreç olarak düşünülebilir. Bir satırdaki ölçümleri tek bir sütuna dönüştürmeden önce, her satırda yalnızca bir ölçüm içerecek şekilde tabloyu düzenleyebilirsiniz. Bunu şu tablo için yapalım:
Tablo 10
name
gender
age0
age1
age2
age3
age4
age5
age6
Emma Williams
F
72.65
82.46
91.76
NA
NA
NA
NA
Aiden Jones
M
69.76
79.89
NA
NA
NA
NA
NA
Sonuç aşağıdaki tabloya benzer:
Tablo 11
name
gender
age0
age1
age2
age3
age4
age5
age6
Emma Williams
F
72.65
NA
NA
NA
NA
Emma Williams
F
82.46
NA
Emma Williams
F
91.76
Aiden Jones
M
69.76
NA
NA
NA
NA
NA
Aiden Jones
M
79.89
Sütunlara dağılmış bu ölçümleri tek bir sütunda toplamadan önce, ölçümlerin ne olduğunu belirten ek bir sütun oluşturmanız gerekir; aşağıdaki gibi:
Tablo 12
name
gender
measure
age0
age1
age2
age3
age4
age5
age6
Emma Williams
F
age0
72.65
NA
NA
NA
NA
Emma Williams
F
age1
82.46
NA
Emma Williams
F
age2
91.76
Aiden Jones
M
age0
69.76
NA
NA
NA
NA
NA
Aiden Jones
M
age1
79.89
Sütun adı genellikle ya “measure” ya da “key” olur. Yukarıdaki tabloda, “age0”, “age1”, “age2”, “age3”, “age4”, “age5” ifadelerinin hem sütun adlarında hem de bir sütunda yer aldığını fark edebilirsiniz. Sütun adlarını çıkarırsanız, tablo aşağıdaki gibi olur.
Tablo 13
name
gender
measure
_
__
___
____
_____
______
_______
Emma Williams
F
age0
72.65
NA
NA
NA
NA
Emma Williams
F
age1
82.46
Emma Williams
F
age2
91.76
Aiden Jones
M
age0
69.76
NA
NA
NA
NA
NA
Aiden Jones
M
age1
79.89
Her satırda yalnızca bir ölçüm olduğundan, bunları tek bir sütunda toplayabilirsiniz ve sonuç şu şekilde olur:
Tablo 14
name
gender
measure
Emma Williams
F
age0
72.65
Emma Williams
F
age1
82.46
Emma Williams
F
age2
91.76
Aiden Jones
M
age0
69.76
Aiden Jones
M
age1
79.89
Tüm ölçümler için yeni bir sütun adı verelim. Genellikle "value" olarak adlandırılır:
Tablo 15
name
gender
measure
value
Emma Williams
F
age0
72.65
Emma Williams
F
age1
82.46
Emma Williams
F
age2
91.76
Aiden Jones
M
age0
69.76
Aiden Jones
M
age1
79.89
Yukarıdaki tabloya bakalım. "age" ifadesinin tekrarlandığını fark ediyor musunuz? Tekrarlanan unsuru kaldırabilirsiniz; bu da size aşağıdaki sonucu verir:
Tablo 16
name
gender
age
value
Emma Williams
F
0
72.65
Emma Williams
F
1
82.46
Emma Williams
F
2
91.76
Aiden Jones
M
0
69.76
Aiden Jones
M
1
79.89
Her satırda tekrar eden Age artık bir sütun adı oldu. Yukarıdaki tablodaki value sütun adı daha da özelleştirilebilir. Onu yalnızca boyu ifade eden height ile değiştirdiniz. Sonucu aşağıdaki tabloda görebilirsiniz:
Tablo 17
name
gender
age
height
Emma Williams
F
0
72.65
Emma Williams
F
1
82.46
Emma Williams
F
2
91.76
Aiden Jones
M
0
69.76
Aiden Jones
M
1
79.89
Tablo 15 ile Tablo 17'yi karşılaştıralım. Tablo 15'in sütun adlarından value her şeyi ifade edebilirken, Tablo 17'deki height çok daha spesifiktir: yalnızca boyu belirtir; oysa Tablo 15'teki value boy, ağırlık, hız veya renk gibi herhangi bir değeri ifade edebilirdi. Başka bir yol da aşağıdaki gibi olabilir:
Tablo 18
name
gender
measure
value
Emma Williams
F
height.age0
72.65
Emma Williams
F
height.age1
82.46
Emma Williams
F
height.age2
91.76
Aiden Jones
M
height.age0
69.76
Aiden Jones
M
height.age1
79.89
Ölçümlerin çeşitli olduğu durumu düşünelim. Ölçümler boy, ağırlık ve BKİ ise, aşağıdaki gibi bir tablo olur. Ancak bu durumda value sütununda farklı ölçeklerde sayısal değerler olduğundan okumak kafa karıştırıcı olabilir. Bu tabloda boy santimetre, ağırlık kilogram cinsindendir:
Tablo 19
name
gender
measure
value
Emma Williams
F
height
72.65
Emma Williams
F
weight
8.22
Emma Williams
F
BMI
22.60
Aiden Jones
M
height
69.76
Aiden Jones
M
weight
8.51
Dolayısıyla geniş formu uzun forma dönüştürürken, hangi değerlerin tek bir sütunda toplanacağına karar vermek gerekir. Bundan sonra sütun adını belirleyebilirsiniz.
Şimdiye kadar söylenenleri özetleyelim: geniş formu uzun forma dönüştürmek için, tek bir sütunda yer alacak şekilde hangi sütunların dönüştürüleceğine karar vermek gerekir. Bunu yaparken birçok sütun tek bir sütunda birleştirilir. Bu nedenle o sütun için bir sütun adına ihtiyacınız olur; bunu sonraki tablolarda görebilirsiniz:
Tablo 20
id1
id2
age0
age1
age2
Emma Williams
F
NA
82.46
91.76
Aiden Jones
M
69.76
79.89
NA
Emma Williams
F
NA
82.46
91.76
Tablo 21
id1
id2
age0
age1
age2
Emma Williams
F
NA
Emma Williams
F
82.46
Emma Williams
F
91.76
Aiden Jones
M
69.76
Aiden Jones
M
79.89
Aiden Jones
M
NA
Emma Williams
F
NA
Emma Williams
F
82.46
Emma Williams
F
91.76
Tablo 22
id1
id2
age_
age0
age1
age2
Emma Williams
F
age0
NA
Emma Williams
F
age1
82.46
Emma Williams
F
age2
91.76
Aiden Jones
M
age0
69.76
Aiden Jones
M
age1
79.89
Aiden Jones
M
age2
NA
Emma Williams
F
age0
NA
Emma Williams
F
age1
82.46
Emma Williams
F
age2
91.76
Tablo 23
id1
id2
age_
Emma Williams
F
age0
NA
Emma Williams
F
age1
82.46
Emma Williams
F
age2
91.76
Aiden Jones
M
age0
69.76
Aiden Jones
M
age1
79.89
Aiden Jones
M
age2
NA
Emma Williams
F
age0
NA
Emma Williams
F
age1
82.46
Emma Williams
F
age2
91.76
Tablo 24
id1
id2
key
value
Emma Williams
F
age0
NA
Emma Williams
F
age1
82.46
Emma Williams
F
age2
91.76
Aiden Jones
M
age0
69.76
Aiden Jones
M
age1
79.89
Aiden Jones
M
age2
NA
Emma Williams
F
age0
NA
Emma Williams
F
age1
82.46
Emma Williams
F
age2
91.76
Tablo 25
id1
id2
key
value
Emma Williams
F
age1
82.46
Emma Williams
F
age2
91.76
Aiden Jones
M
age0
69.76
Aiden Jones
M
age1
79.89
Emma Williams
F
age1
82.46
Emma Williams
F
age2
91.76
Yukarıdaki tabloda id1 ve id2 sütunlarına bakalım. id2 bir bireyi belirtmez, bir bireyin özniteliğidir (cinsiyet). Başka bir deyişle, bunun bir ölçüm olduğunu söyleyebilirsiniz. Bu nedenle daha uzun forma dönüştürebilirsiniz. En uzun form, id, key ve value olmak üzere üç sütundan oluşur.
Tablo 26
id
key
value
Emma Williams
gender
F
Emma Williams
age1
82.46
Emma Williams
age2
91.76
Aiden Jones
gender
F
Aiden Jones
age0
69.76
Aiden Jones
age1
79.89
Emma Williams
gender
F
Emma Williams
age1
82.46
Emma Williams
age2
91.76
Yukarıdaki tablo, tablo 25’ten en uzun formu göstermektedir. Ancak farklı kişiler aynı isme sahip olabilir.
Bu durumda, uzun form kafa karıştırıcı olabilir çünkü id tek bir kişiyi belirleyemez. İsimlerin arkasına bir sayı koyarak kişileri ayırt edebilirsiniz (örneğin R fonksiyonu make.unique() kullanılarak), ancak değiştirilen isim ile orijinal ismi sayı eklenmiş hâliyle ayırt edemezsiniz. Gerçekten adı "John.2" olan birini düşünün!
Bunun bariz çözümü, farklı kişiler için farklı sayısal kimlikler atamaktır. Bu durumda, isimler de başka ölçümler olur.
Sonraki tablo, isimlerin bile ölçüm olarak kabul edildiğini göstermektedir. Bir bakıma bu, gerçek anlamda en uzun formdur.
Tablo 27
id
key
value
1
name
Emma Williams
1
gender
F
1
age1
82.46
1
age2
91.76
2
name
Aiden Jones
2
gender
F
2
age0
69.76
2
age1
79.89
3
name
Emma Williams
3
gender
F
3
age1
82.46
3
age2
91.76
En uzun form, geniş forma dönüştürmek için en kolay olandır. Geniş formu uzun forma dönüştürme sürecini (tablolar 20’den 25’e kadar) tersine çevirirseniz, geniş forma ulaşırsınız. Aşağıdaki tablolar bu süreci göstermektedir:
Tablo 28. key sütunundaki ölçümler sütun adında yinelenir
id
key
name
gender
age0
age1
age2
1
name
Emma Williams
1
gender
F
1
age1
82.46
1
age2
91.76
2
name
Aiden Jones
2
gender
F
2
age0
69.76
2
age1
79.89
3
name
Emma Williams
3
gender
F
3
age1
82.46
3
age2
91.76
Tablo 29. key sütunu silinebilir
id
name
gender
age0
age1
age2
1
Emma Williams
1
F
1
82.46
1
91.76
2
Aiden Jones
2
F
2
69.76
2
79.89
3
Emma Williams
3
F
3
82.46
3
91.76
Tablo 30. Aynı id tek bir satırda toplanabilir
id
name
gender
age0
age1
age2
1
Emma Williams
F
82.46
91.76
1
1
1
2
Aiden Jones
F
69.76
79.89
2
2
2
3
Emma Williams
F
82.46
91.76
3
3
3
Tablo 31. Ölçümü olmayan satırları silin
id
name
gender
age0
age1
age2
1
Emma Williams
F
82.46
91.76
2
Aiden Jones
F
69.76
79.89
3
Emma Williams
F
82.46
91.76
Geniş formu uzun forma dönüştürmenin kilit unsuru, hangi sütunların tek bir sütunda toplanacağına karar vermektir.
Ancak bu mutlaka tek bir sütun olmak zorunda değildir. Gerekirse iki sütun da kullanabilirsiniz; tıpkı aşağıdaki tabloda olduğu gibi:
Tablo 32
name
gender
h2011
h2012
w2011
w2012
Jackson Smith
M
74.69
84.99
9.60
12.0
Olivia Miller
F
NA
80.76
7.15
10.7
Ava Wilson
F
88.77
96.45
NA
15.0
Bunu uzun forma dönüştürebilir misiniz?
h2011, h2012, w2011, w2012 sütunları 2011 ve 2012 yıllarındaki boy ve kiloları ifade eder. height ve weight farklı ölçeklerde ölçülür — cm, kg. Bu yüzden hem boy hem kilo için tek bir sütun kullanabilir ya da iki sütun kullanabilirsiniz; tıpkı bu tablodaki gibi:
Tablo 33
name
gender
year
height
weight
Jackson Smith
M
2011
74.69
9.60
Jackson Smith
M
2012
84.99
12.00
Olivia Miller
F
2011
NA
80.76
Olivia Miller
F
2012
7.15
10.70
Ava Wilson
F
2011
88.77
96.45
Ava Wilson
F
2012
NA
15.00
Bu uzun form mu yoksa geniş form mu?
R'de Uzundan Genişe Veri Dönüşümü
Uzun form ile geniş form arasındaki dönüşümü R ile yapalım. Bu görev için kullanılabilecek birçok fonksiyon ve paket vardır.
Tablo 34
func
package
to_long_form
to_wide_form
stack/unstack
utils
stack
unstack
reshape
stats
reshape(direction="long", ...)
reshape(direction="wide", ...)
melt/dcast
reshape2
melt
dcast
gather/spread
tidyr
gather
spread
Burada reshape2 paketinin melt() ve dcast() fonksiyonlarının nasıl kullanılacağını anlatacağım. Bunun nedeni, stack() ve unstack() temel fonksiyonlar olduğundan, sonuçları üzerinde sonradan işlem yapma gerekliliğidir. gather() ve spread() fonksiyonlarının da tidyr paketinden geldiğini ve oldukça popüler olduğunu not edin, ancak bu eğitimde ele alınmayacaktır.
Kullanabileceğiniz bir başka fonksiyon da stats paketiyle gelen reshape()’tir. Aslında, bu fonksiyonla karışıklık yaşamayın; çünkü reshape adlı bir paket de vardır! Bu paket, reshape2 ile birlikte, reshape() ile zorlananlar için geliştirilmiştir. Ayrıca reshape() fonksiyonunun verilerin boylamsal olduğu, yani ölçümlerin zaman içinde tekrarlandığı varsayımına sahip olduğu da görülmektedir.
Tablo 35’teki verileri uzun forma dönüştürelim. Aşağıdaki tablonun dat adlı bir data.frame sakladığını varsayın.
## name gender year2011 year2012 year2013
## 1 Jackson Smith M74.6984.9991.73
## 2 Emma Williams FNANA75.74
## 3 Liam Brown M88.24NA101.83
## 4 Ava Wilson F88.7796.45NAAltyapı:
Sormak istediğiniz soru şudur: "hangi sütunlar bir sütunda birleştirilecek?"
Bunlar year2011, year2012, year2013 olacaktır. melt() fonksiyonunu kullandığınızda, bu sütunlar measure.vars için listelenmelidir:
melt(babies, measure.vars =c("year2011","year2012","year2013"))
## name gender variable value
## 1 Jackson Smith M year2011 74.69
## 2 Emma Williams F year2011 NA
## 3 Liam Brown M year2011 88.24
## 4 Ava Wilson F year2011 88.77
## 5 Jackson Smith M year2012 84.99
## 6 Emma Williams F year2012 NA
## 7 Liam Brown M year2012 NA
## 8 Ava Wilson F year2012 96.45
## 9 Jackson Smith M year2013 91.73
## 10 Emma Williams F year2013 75.74
## 11 Liam Brown M year2013 101.83
## 12 Ava Wilson F year2013 NAAltyapı:
year2011, year2012, year2013 3., 4. ve 5. sütunlarda yer alır; bu nedenle bunu kullanabilirsiniz:
melt(babies, measure.vars =3:5)
## name gender variable value
## 1 Jackson Smith M year2011 74.69
## 2 Emma Williams F year2011 NA
## 3 Liam Brown M year2011 88.24
## 4 Ava Wilson F year2011 88.77
## 5 Jackson Smith M year2012 84.99
## 6 Emma Williams F year2012 NA
## 7 Liam Brown M year2012 NA
## 8 Ava Wilson F year2012 96.45
## 9 Jackson Smith M year2013 91.73
## 10 Emma Williams F year2013 75.74
## 11 Liam Brown M year2013 101.83
## 12 Ava Wilson F year2013 NAAltyapı:
Sonuç yukarıdaki tabloda. variable ve value sütun adlarına dikkat edin. Tablo 23 ve tablo 24, yeni sütun adlarına ihtiyaç olduğunu göstermişti. melt() işlevinin yeni sütunlar için varsayılan adları variable ve value’dır. Varsayılanı variable.name= ve value.name= bağımsız değişkenleriyle geçersiz kılabilirsiniz. Aşağıda bunu yapalım:
melt(babies, measure.vars=3:5, variable.name="year", value.name="height")
## name gender year height
## 1 Jackson Smith M year2011 74.69
## 2 Emma Williams F year2011 NA
## 3 Liam Brown M year2011 88.24
## 4 Ava Wilson F year2011 88.77
## 5 Jackson Smith M year2012 84.99
## 6 Emma Williams F year2012 NA
## 7 Liam Brown M year2012 NA
## 8 Ava Wilson F year2012 96.45
## 9 Jackson Smith M year2013 91.73
## 10 Emma Williams F year2013 75.74
## 11 Liam Brown M year2013 101.83
## 12 Ava Wilson F year2013 NAAltyapı:
Ölçümler yukarıdaki örneklerde belirtildi. Sizin çalıştığınız ayarlarda Id ölçümleri dolaylı olarak belirtebilir. Bu nedenle ölçümler yerine kimlik (id) için sütunları seçebilirsiniz.
Aşağıdaki her iki kullanım için de sonuç aynıdır. İlkinde kimlik için sütunlar seçilir, ikincisinde toplanacak sütunlar seçilir:
melt(babies, id.vars=c("name","gender"))melt(babies, measure.vars =c("year2011","year2012","year2013"))
## name gender variable value
## 1 Jackson Smith M year2011 74.69
## 2 Emma Williams F year2011 NA
## 3 Liam Brown M year2011 88.24
## 4 Ava Wilson F year2011 88.77
## 5 Jackson Smith M year2012 84.99
## 6 Emma Williams F year2012 NA
## 7 Liam Brown M year2012 NA
## 8 Ava Wilson F year2012 96.45
## 9 Jackson Smith M year2013 91.73
## 10 Emma Williams F year2013 75.74
## 11 Liam Brown M year2013 101.83
## 12 Ava Wilson F year2013 NAAltyapı:
Hem id.vars hem de measure.vars belirtirseniz, bunların hiçbirine dahil olmayan sütunlar sonuçtan çıkarılır. Örneğin, aşağıdaki kod bloğuna bakın:
melt(babies, id.vars=c("name"), measure.vars=c("year2011","year2012"))
## name variable value
## 1 Jackson Smith year2011 74.69
## 2 Emma Williams year2011 NA
## 3 Liam Brown year2011 88.24
## 4 Ava Wilson year2011 88.77
## 5 Jackson Smith year2012 84.99
## 6 Emma Williams year2012 NA
## 7 Liam Brown year2012 NA
## 8 Ava Wilson year2012 96.45Altyapı:
Ayrıca, na.rm=T NA değerlerini kaldırabilir:
melt(babies, id.vars=c("name"), measure.vars=c("year2011","year2012"), na.rm=T)
## name variable value
## 1 Jackson Smith year2011 74.69
## 3 Liam Brown year2011 88.24
## 4 Ava Wilson year2011 88.77
## 5 Jackson Smith year2012 84.99
## 8 Ava Wilson year2012 96.45Altyapı:
dcast() işlevi, melt()’in tersini yapar. En uzun formun sütunları id, variable ve value’dır. dcast(data, id ~ variable, value.var="value"), en uzun formu geniş forma dönüştürür.
babiesLong <-melt(babies, id.vars=c("name"), measure.vars=c("year2011","year2012"), na.rm=T)
babiesLong
## name variable value
## 1 Jackson Smith year2011 74.69
## 3 Liam Brown year2011 88.24
## 4 Ava Wilson year2011 88.77
## 5 Jackson Smith year2012 84.99
## 8 Ava Wilson year2012 96.45Altyapı:
babiesLong içinde id olarak name, variable olarak variable ve value olarak value bulunur. Bu nedenle, onu geniş forma dönüştürmek için dcast() kullanabilirsiniz:
dcast(babiesLong, name ~ variable, value.var="value")
## name year2011 year2012
## 1 Ava Wilson 88.7796.45
## 2 Jackson Smith 74.6984.99
## 3 Liam Brown 88.24NAAltyapı:
Sonuç
Bu kadar gibi görünüyor. Bu eğitimde, veriyi yeniden biçimlendirmenin mantığına ve sürecine odaklandınız. Genellikle analiz için uzun form tercih edilir, ancak istisnalar vardır. Geniş formda veri sunumu, uygun olduğunda yer kazandırabilir; ancak eksik değerlerin sayısı arttıkça uzun forma dönüştürmeniz daha iyi olur.
Biçim dönüştürmede, ölçümlerin ne olduğuna odaklanmanız gerekir. Uzun form için motto, satır başına bir ölçüm; geniş formda ise bir satırda birden çok ölçüm bulunur. Sütunlar genelinde bulunan ölçümleri tek bir sütunda topladığınızda, özgün sütun adlarının ek bir sütunda korunması gerekir. Ölçümleri tek bir sütundan sütunlara yaydığınızda ise sütun adlarının variable sütunundan nasıl türetileceğini belirlemeniz gerekir.
Süreci anladığınızda, dcast() ve melt() gibi işlevleri kullanmak çok daha kolay hale gelir!
Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
İnsanların uzun formattaki veriyi (buna "uzun form" denir; ne anlama geldiği birazdan netleşecek) geniş formata ve tersini dönüştürmesi gereken zamanlar olur. Gerçek hayatta veri her türlü formatta gelir, ancak R fonksiyonlarının çoğu belirli bir form için tasarlanmıştır.
Örneğin, karma doğrusal modelleme için
lme4::lmer(), görselleştirme içinggplot2::ggplot()uzun form için tasarlanmıştır. Öte yandanmosaicplot()gibi geniş form için tasarlanmış fonksiyonlar da vardır. Bu da, verileriniz zaten işlenmiş ve doğru formda değilse analiz veya görselleştirme yapabilmek için formu dönüştürmeniz gerektiği anlamına gelir.R'de format dönüşümü için birkaç seçenek vardır ancak yeni başlarken oldukça kafa karıştırıcı olabilir.
Bu eğitim, veriyi uzun form ile geniş form arasında dönüştürmenin mantığını anlamanızı sağlayacak. Aşağıdaki konuları inceleyeceksiniz:
melt()vedcast()fonksiyonlarıyla uzun formattan geniş formata nasıl geçileceğini öğreneceksiniz.Veri
Bu tablo küçük bir yerel bölgede bebeklerin boylarını göstermektedir. Boylar 2011 yılından 2015 yılına kadar ölçülmüştür. Muhtemelen bildiğiniz gibi,
NA‘Kayıt Yok’ anlamına gelir. NA’ların konumundan bebeklerin yaşlarını çıkarabilirsiniz, ancak tablodan bir bebeğin tam yaşı elde edilemez. Tablo düzenli görünüyor, ancak bebeklerin büyümesini incelemek isteyen herkes için bir sorun var: önemli olan bebeğin ölçüldüğü mutlak zaman değil, ölçüm anındaki yaşıdır. Bu bilgiyi tabloya ekleyebilir misiniz? Aşağıda bir yöntem görebilirsiniz:NAsayısı arttı. ## Geniş Form Veri Peki bir bebeğin kaç aylık olduğunu aktarmak isteseydiniz ne yapardınız? Şuna benzer olurdu:Yukarıdaki tabloda tonla
NAvar. Bebeklerin göreli ölçüm zamanları farklıysa, geniş form çok fazla alan israf edebilir. Başka bir seçenek, 2015 yılında bebeklerin yaşlarını eklemek olabilir, ancak bu yalnızca mutlak ölçüm zamanları tamamen aynıysa mümkündür. Bebekler ölçüm zamanında aylara göre farklılık gösteriyorsa ve yaşları ay cinsinden bilmek istiyorsanız, bu işe yaramaz. O zaman bu örnek tek yol gibi görünüyor. Bu durumda uzun formu kullanmayı düşünebilirsiniz. ## Uzun Formda Veri Geniş formda bir bebeğe ait tüm ölçümler tek satırda gösterilirken, uzun formda bir satırda yalnızca bir bebeğe ait tek bir ölçüm görürsünüz. En basit yöntem, bir satırda çocuğun adını, ölçüm zamanını ve ölçümü (boy) göstermektir. Tam olarak bu tablo bunu gösteriyor:Veriyi adlara göre sıralarsanız, aşağıdaki gibi bir tablo elde edersiniz. Açıkça görüldüğü gibi, bu tablo yukarıda gördüğünüz Tablo 3'ten daha az yer kaplar!
Uzun ve Geniş Karşılaştırması
Not: Geniş form ile uzun form arasındaki temel farkları yeniden hatırlayın: Basit bir fark şudur: geniş form bir bireye ait birçok ölçümü tek satırda gösterir ve sütun adları ölçümlerin ne olduğunu belirtir.
Bu tablo Liam Brown’ın 2011-2015 yıllarındaki boylarını tek satırda gösteriyor:
Uzun formda ise Liam Brown'ın boyları tek bir sütunda gösterilir:
Gördüğünüz gibi, ölçümlerin ne olduğunu bilemezsiniz. Sütun adını yazarsanız şöyle görünür:
Ancak bunun da kendi sorunu var. Sophia Johnson’ın boyu 2011-2014 yıllarında ölçülmedi. Bu yüzden aşağıda gördüğünüz gibi sütun adını kolayca belirleyemezsiniz:
Geniş Formdan Uzun Forma
Geniş formu uzun forma dönüştürmek adım adım bir süreç olarak düşünülebilir. Bir satırdaki ölçümleri tek bir sütuna dönüştürmeden önce, her satırda yalnızca bir ölçüm içerecek şekilde tabloyu düzenleyebilirsiniz. Bunu şu tablo için yapalım:
Sonuç aşağıdaki tabloya benzer:
Sütunlara dağılmış bu ölçümleri tek bir sütunda toplamadan önce, ölçümlerin ne olduğunu belirten ek bir sütun oluşturmanız gerekir; aşağıdaki gibi:
Sütun adı genellikle ya
“measure”ya da“key”olur. Yukarıdaki tabloda,“age0”,“age1”,“age2”,“age3”,“age4”,“age5”ifadelerinin hem sütun adlarında hem de bir sütunda yer aldığını fark edebilirsiniz. Sütun adlarını çıkarırsanız, tablo aşağıdaki gibi olur.Her satırda yalnızca bir ölçüm olduğundan, bunları tek bir sütunda toplayabilirsiniz ve sonuç şu şekilde olur:
Tüm ölçümler için yeni bir sütun adı verelim. Genellikle "value" olarak adlandırılır:
Yukarıdaki tabloya bakalım. "age" ifadesinin tekrarlandığını fark ediyor musunuz? Tekrarlanan unsuru kaldırabilirsiniz; bu da size aşağıdaki sonucu verir:
Her satırda tekrar eden
Ageartık bir sütun adı oldu. Yukarıdaki tablodakivaluesütun adı daha da özelleştirilebilir. Onu yalnızca boyu ifade edenheightile değiştirdiniz. Sonucu aşağıdaki tabloda görebilirsiniz:Tablo 15 ile Tablo 17'yi karşılaştıralım. Tablo 15'in sütun adlarından
valueher şeyi ifade edebilirken, Tablo 17'dekiheightçok daha spesifiktir: yalnızca boyu belirtir; oysa Tablo 15'teki value boy, ağırlık, hız veya renk gibi herhangi bir değeri ifade edebilirdi. Başka bir yol da aşağıdaki gibi olabilir:Ölçümlerin çeşitli olduğu durumu düşünelim. Ölçümler boy, ağırlık ve BKİ ise, aşağıdaki gibi bir tablo olur. Ancak bu durumda
valuesütununda farklı ölçeklerde sayısal değerler olduğundan okumak kafa karıştırıcı olabilir. Bu tabloda boy santimetre, ağırlık kilogram cinsindendir:Dolayısıyla geniş formu uzun forma dönüştürürken, hangi değerlerin tek bir sütunda toplanacağına karar vermek gerekir. Bundan sonra sütun adını belirleyebilirsiniz.
Şimdiye kadar söylenenleri özetleyelim: geniş formu uzun forma dönüştürmek için, tek bir sütunda yer alacak şekilde hangi sütunların dönüştürüleceğine karar vermek gerekir. Bunu yaparken birçok sütun tek bir sütunda birleştirilir. Bu nedenle o sütun için bir sütun adına ihtiyacınız olur; bunu sonraki tablolarda görebilirsiniz:
Yukarıdaki tabloda
id1veid2sütunlarına bakalım.id2bir bireyi belirtmez, bir bireyin özniteliğidir (cinsiyet). Başka bir deyişle, bunun bir ölçüm olduğunu söyleyebilirsiniz. Bu nedenle daha uzun forma dönüştürebilirsiniz. En uzun form,id,keyvevalueolmak üzere üç sütundan oluşur.Yukarıdaki tablo, tablo 25’ten en uzun formu göstermektedir. Ancak farklı kişiler aynı isme sahip olabilir.
Bu durumda, uzun form kafa karıştırıcı olabilir çünkü
idtek bir kişiyi belirleyemez. İsimlerin arkasına bir sayı koyarak kişileri ayırt edebilirsiniz (örneğin R fonksiyonumake.unique()kullanılarak), ancak değiştirilen isim ile orijinal ismi sayı eklenmiş hâliyle ayırt edemezsiniz. Gerçekten adı "John.2" olan birini düşünün!Bunun bariz çözümü, farklı kişiler için farklı sayısal kimlikler atamaktır. Bu durumda, isimler de başka ölçümler olur.
Sonraki tablo, isimlerin bile ölçüm olarak kabul edildiğini göstermektedir. Bir bakıma bu, gerçek anlamda en uzun formdur.
En uzun form, geniş forma dönüştürmek için en kolay olandır. Geniş formu uzun forma dönüştürme sürecini (tablolar 20’den 25’e kadar) tersine çevirirseniz, geniş forma ulaşırsınız. Aşağıdaki tablolar bu süreci göstermektedir:
Geniş formu uzun forma dönüştürmenin kilit unsuru, hangi sütunların tek bir sütunda toplanacağına karar vermektir.
Ancak bu mutlaka tek bir sütun olmak zorunda değildir. Gerekirse iki sütun da kullanabilirsiniz; tıpkı aşağıdaki tabloda olduğu gibi:
Bunu uzun forma dönüştürebilir misiniz?
h2011,h2012,w2011,w2012sütunları 2011 ve 2012 yıllarındaki boy ve kiloları ifade eder.heightveweightfarklı ölçeklerde ölçülür — cm, kg. Bu yüzden hem boy hem kilo için tek bir sütun kullanabilir ya da iki sütun kullanabilirsiniz; tıpkı bu tablodaki gibi:Bu uzun form mu yoksa geniş form mu?
R'de Uzundan Genişe Veri Dönüşümü
Uzun form ile geniş form arasındaki dönüşümü R ile yapalım. Bu görev için kullanılabilecek birçok fonksiyon ve paket vardır.
Burada
reshape2paketininmelt()vedcast()fonksiyonlarının nasıl kullanılacağını anlatacağım. Bunun nedeni,stack()veunstack()temel fonksiyonlar olduğundan, sonuçları üzerinde sonradan işlem yapma gerekliliğidir.gather()vespread()fonksiyonlarının datidyrpaketinden geldiğini ve oldukça popüler olduğunu not edin, ancak bu eğitimde ele alınmayacaktır.Kullanabileceğiniz bir başka fonksiyon da
statspaketiyle gelenreshape()’tir. Aslında, bu fonksiyonla karışıklık yaşamayın; çünküreshapeadlı bir paket de vardır! Bu paket,reshape2ile birlikte,reshape()ile zorlananlar için geliştirilmiştir. Ayrıcareshape()fonksiyonunun verilerin boylamsal olduğu, yani ölçümlerin zaman içinde tekrarlandığı varsayımına sahip olduğu da görülmektedir.Tablo 35’teki verileri uzun forma dönüştürelim. Aşağıdaki tablonun
datadlı birdata.framesakladığını varsayın.babies = data.frame(name= c("Jackson Smith", "Emma Williams", "Liam Brown", "Ava Wilson"), gender = c("M", "F", "M", "F"), year2011= c(74.69, NA, 88.24, 88.77), year2012=c(84.99, NA, NA, 96.45), year2013=c(91.73, 75.74, 101.83, NA)) babies
Sormak istediğiniz soru şudur: "hangi sütunlar bir sütunda birleştirilecek?"
Bunlar
year2011,year2012,year2013olacaktır.melt()fonksiyonunu kullandığınızda, bu sütunlarmeasure.varsiçin listelenmelidir:year2011,year2012,year20133., 4. ve 5. sütunlarda yer alır; bu nedenle bunu kullanabilirsiniz:Sonuç yukarıdaki tabloda.
variablevevaluesütun adlarına dikkat edin. Tablo 23 ve tablo 24, yeni sütun adlarına ihtiyaç olduğunu göstermişti.melt()işlevinin yeni sütunlar için varsayılan adlarıvariablevevalue’dır. Varsayılanıvariable.name=vevalue.name=bağımsız değişkenleriyle geçersiz kılabilirsiniz. Aşağıda bunu yapalım:Ölçümler yukarıdaki örneklerde belirtildi. Sizin çalıştığınız ayarlarda
Idölçümleri dolaylı olarak belirtebilir. Bu nedenle ölçümler yerine kimlik (id) için sütunları seçebilirsiniz.Aşağıdaki her iki kullanım için de sonuç aynıdır. İlkinde kimlik için sütunlar seçilir, ikincisinde toplanacak sütunlar seçilir:
Hem
id.varshem demeasure.varsbelirtirseniz, bunların hiçbirine dahil olmayan sütunlar sonuçtan çıkarılır. Örneğin, aşağıdaki kod bloğuna bakın:Ayrıca,
na.rm=TNA değerlerini kaldırabilir:dcast()işlevi,melt()’in tersini yapar. En uzun formun sütunlarıid,variablevevalue’dır.dcast(data, id ~ variable, value.var="value"), en uzun formu geniş forma dönüştürür.babiesLongiçindeidolarak name,variableolarak variable vevalueolarak value bulunur. Bu nedenle, onu geniş forma dönüştürmek içindcast()kullanabilirsiniz:Sonuç
Bu kadar gibi görünüyor. Bu eğitimde, veriyi yeniden biçimlendirmenin mantığına ve sürecine odaklandınız. Genellikle analiz için uzun form tercih edilir, ancak istisnalar vardır. Geniş formda veri sunumu, uygun olduğunda yer kazandırabilir; ancak eksik değerlerin sayısı arttıkça uzun forma dönüştürmeniz daha iyi olur.
Biçim dönüştürmede, ölçümlerin ne olduğuna odaklanmanız gerekir. Uzun form için motto, satır başına bir ölçüm; geniş formda ise bir satırda birden çok ölçüm bulunur. Sütunlar genelinde bulunan ölçümleri tek bir sütunda topladığınızda, özgün sütun adlarının ek bir sütunda korunması gerekir. Ölçümleri tek bir sütundan sütunlara yaydığınızda ise sütun adlarının
variablesütunundan nasıl türetileceğini belirlemeniz gerekir.Süreci anladığınızda,
dcast()vemelt()gibi işlevleri kullanmak çok daha kolay hale gelir!