Ana içeriğe geç

R’da Uzundan Genişe Veri

Verinizi neden uzun biçimden geniş biçime ve tersine dönüştüreceğinizi öğrenin ve bunu R’da melt() ve dcast() ile nasıl yapacağınızı keşfedin!
· 15 dk. oku

Yapay Zeka ile Keşfedin

İ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
namegenderyear2011year2012year2013year2014year2015
Jackson SmithM74.6984.9991.73105.11111.04
Sophia JohnsonFNANANANA75.89
Emma WilliamsFNANA75.7486.5091.50
Aiden JonesMNANANA71.8981.42
Liam BrownM88.2496.91101.85108.13112.45
Lucas DavisM70.6083.7894.17100.03106.35
Olivia MillerF64.7880.7687.3097.13103.80
Ava WilsonF88.7796.45104.72112.84NA

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
namegenderage0age1age2age3age4age5age6
Jackson SmithMNA76.6984.9197.06105.73107.32NA
Sophia JohnsonFNA76.05NANANANANA
Emma WilliamsF72.6582.4691.76NANANANA
Aiden JonesM69.7679.89NANANANANA
Liam BrownMNANA85.3493.22105.78105.84114.82
Lucas DavisM71.5984.8792.10100.73104.21NANA
Olivia MillerF62.7481.3992.0298.32106.44NANA
Ava WilsonFNANA88.39100.67107.58111.52NA

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
namegenderm4m6m7m10m12...m55m60m65m72
Jackson SmithMNANANANA76.69...NA107.32NANA
Sophia JohnsonFNANANANA76.05...NANANANA
Emma WilliamsFNANANA72.65NA...NANANANA
Aiden JonesMNA69.76NANANA...NANANANA
Liam BrownMNANANANANA...NA105.84NA114.82
Lucas DavisMNANA71.59NANA...104.21NANANA
Olivia MillerF62.74NANANANA...NANANANA
Ava WilsonFNANANANANA...NANA111.52NA

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
namegendermonthheight
Olivia MillerF462.74
Aiden JonesM669.76
Lucas DavisM771.59
Emma WilliamsF1072.65
Jackson SmithM1276.69
............
Liam BrownM72114.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
namegendermonthheight
Jackson SmithM1276.69
Jackson SmithM2484.91
Jackson SmithM3697.06
Jackson SmithM48105.73
Jackson SmithM60107.32
Sophia JohnsonF1276.05
Emma WilliamsF1072.65
............
Ava WilsonF65111.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
namegenderyear2011year2012year2013year2014year2015
Liam BrownM88.2496.91101.85108.13112.45

Uzun formda ise Liam Brown'ın boyları tek bir sütunda gösterilir:

Tablo 07
namegender_
Liam BrownM85.34
Liam BrownM93.22
Liam BrownM105.78
Liam BrownM105.84
Liam BrownM114.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
namegenderyear2011, 2012, 2013, 2014, 2015
Liam BrownM85.34
Liam BrownM93.22
Liam BrownM105.78
Liam BrownM105.84
Liam BrownM114.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
namegender?
Liam BrownM85.34
Liam BrownM93.22
Liam BrownM105.78
Liam BrownM105.84
Liam BrownM114.82
Sophia JohnsonF76.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
namegenderage0age1age2age3age4age5age6
Emma WilliamsF72.6582.4691.76NANANANA
Aiden JonesM69.7679.89NANANANANA

Sonuç aşağıdaki tabloya benzer:

Tablo 11
namegenderage0age1age2age3age4age5age6
Emma WilliamsF72.65  NANANANA
Emma WilliamsF 82.46    NA
Emma WilliamsF  91.76    
Aiden JonesM69.76 NANANANANA
Aiden JonesM 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
namegendermeasureage0age1age2age3age4age5age6
Emma WilliamsFage072.65  NANANANA
Emma WilliamsFage1 82.46    NA
Emma WilliamsFage2  91.76    
Aiden JonesMage069.76 NANANANANA
Aiden JonesMage1 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
namegendermeasure____________________________
Emma WilliamsFage072.65  NANANANA
Emma WilliamsFage1 82.46     
Emma WilliamsFage2  91.76    
Aiden JonesMage069.76 NANANANANA
Aiden JonesMage1 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
namegendermeasure 
Emma WilliamsFage072.65
Emma WilliamsFage182.46
Emma WilliamsFage291.76
Aiden JonesMage069.76
Aiden JonesMage179.89

Tüm ölçümler için yeni bir sütun adı verelim. Genellikle "value" olarak adlandırılır:

Tablo 15
namegendermeasurevalue
Emma WilliamsFage072.65
Emma WilliamsFage182.46
Emma WilliamsFage291.76
Aiden JonesMage069.76
Aiden JonesMage179.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
namegenderagevalue
Emma WilliamsF072.65
Emma WilliamsF182.46
Emma WilliamsF291.76
Aiden JonesM069.76
Aiden JonesM179.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
namegenderageheight
Emma WilliamsF072.65
Emma WilliamsF182.46
Emma WilliamsF291.76
Aiden JonesM069.76
Aiden JonesM179.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
namegendermeasurevalue
Emma WilliamsFheight.age072.65
Emma WilliamsFheight.age182.46
Emma WilliamsFheight.age291.76
Aiden JonesMheight.age069.76
Aiden JonesMheight.age179.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
namegendermeasurevalue
Emma WilliamsFheight72.65
Emma WilliamsFweight8.22
Emma WilliamsFBMI22.60
Aiden JonesMheight69.76
Aiden JonesMweight8.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
id1id2age0age1age2
Emma WilliamsFNA82.4691.76
Aiden JonesM69.7679.89NA
Emma WilliamsFNA82.4691.76
Tablo 21
id1id2age0age1age2
Emma WilliamsFNA  
Emma WilliamsF 82.46 
Emma WilliamsF  91.76
Aiden JonesM69.76  
Aiden JonesM 79.89 
Aiden JonesM  NA
Emma WilliamsFNA  
Emma WilliamsF 82.46 
Emma WilliamsF  91.76
Tablo 22
id1id2age_age0age1age2
Emma WilliamsFage0NA  
Emma WilliamsFage1 82.46 
Emma WilliamsFage2  91.76
Aiden JonesMage069.76  
Aiden JonesMage1 79.89 
Aiden JonesMage2  NA
Emma WilliamsFage0NA  
Emma WilliamsFage1 82.46 
Emma WilliamsFage2  91.76
Tablo 23
id1id2age_ 
Emma WilliamsFage0NA
Emma WilliamsFage182.46
Emma WilliamsFage291.76
Aiden JonesMage069.76
Aiden JonesMage179.89
Aiden JonesMage2NA
Emma WilliamsFage0NA
Emma WilliamsFage182.46
Emma WilliamsFage291.76
Tablo 24
id1id2keyvalue
Emma WilliamsFage0NA
Emma WilliamsFage182.46
Emma WilliamsFage291.76
Aiden JonesMage069.76
Aiden JonesMage179.89
Aiden JonesMage2NA
Emma WilliamsFage0NA
Emma WilliamsFage182.46
Emma WilliamsFage291.76
Tablo 25
id1id2keyvalue
Emma WilliamsFage182.46
Emma WilliamsFage291.76
Aiden JonesMage069.76
Aiden JonesMage179.89
Emma WilliamsFage182.46
Emma WilliamsFage291.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
idkeyvalue
Emma WilliamsgenderF
Emma Williamsage182.46
Emma Williamsage291.76
Aiden JonesgenderF
Aiden Jonesage069.76
Aiden Jonesage179.89
Emma WilliamsgenderF
Emma Williamsage182.46
Emma Williamsage291.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
idkeyvalue
1nameEmma Williams
1genderF
1age182.46
1age291.76
2nameAiden Jones
2genderF
2age069.76
2age179.89
3nameEmma Williams
3genderF
3age182.46
3age291.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
idkeynamegenderage0age1age2
1nameEmma Williams    
1gender F   
1age1   82.46 
1age2    91.76
2nameAiden Jones    
2gender F   
2age0  69.76  
2age1   79.89 
3nameEmma Williams    
3gender F   
3age1   82.46 
3age2    91.76
Tablo 29. key sütunu silinebilir
idnamegenderage0age1age2
1Emma Williams    
1 F   
1   82.46 
1    91.76
2Aiden Jones    
2 F   
2  69.76  
2   79.89 
3Emma Williams    
3 F   
3   82.46 
3    91.76
Tablo 30. Aynı id tek bir satırda toplanabilir
idnamegenderage0age1age2
1Emma WilliamsF 82.4691.76
1     
1     
1     
2Aiden JonesF69.7679.89 
2     
2     
2     
3Emma WilliamsF 82.4691.76
3     
3     
3     
Tablo 31. Ölçümü olmayan satırları silin
idnamegenderage0age1age2
1Emma WilliamsF 82.4691.76
2Aiden JonesF69.7679.89 
3Emma WilliamsF 82.4691.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
namegenderh2011h2012w2011w2012
Jackson SmithM74.6984.999.6012.0
Olivia MillerFNA80.767.1510.7
Ava WilsonF88.7796.45NA15.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
namegenderyearheightweight
Jackson SmithM201174.699.60
Jackson SmithM201284.9912.00
Olivia MillerF2011NA80.76
Olivia MillerF20127.1510.70
Ava WilsonF201188.7796.45
Ava WilsonF2012NA15.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
funcpackageto_long_formto_wide_form
stack/unstackutilsstackunstack
reshapestatsreshape(direction="long", ...)reshape(direction="wide", ...)
melt/dcastreshape2meltdcast
gather/spreadtidyrgatherspread

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.

Tablo 35
namegenderyear2011year2012year2013
Jackson SmithM74.6984.9991.73
Emma WilliamsFNANA75.74
Liam BrownM88.24NA101.85
Ava WilsonF88.7796.45NA

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

##            name gender year2011 year2012 year2013
## 1 Jackson Smith      M    74.69    84.99    91.73
## 2 Emma Williams      F       NA       NA    75.74
## 3    Liam Brown      M    88.24       NA   101.83
## 4    Ava Wilson      F    88.77    96.45       NA

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     NA

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     NA

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     NA

Ö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     NA

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.45

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.45

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.45

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.77    96.45
## 2 Jackson Smith    74.69    84.99
## 3    Liam Brown    88.24       NA

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!

Konular

İlgili