Bölüm8 Dplyr Paketi
Bir çok veri tabanı göründüğünden daha fazla bilgi içerir. dplyr
paketi, gruplar arası farklar, değişken gruplamaları, yeni değişkenler oluşturma ve benzeri işlemleri gerçekleştirerek bu gizli bilginin açığa çıkması için kullanılan R paketlerinden biridir. Bu bölümdeki işlemleri yapmak için aşağıdaki kodları kullanarak dplyr
paketini bilgisayarınıza indirdiğinizden ve R oturumuna eklediğinizden emin olunuz.
install.packages("dplyr")
install.packages("hflights")
library(dplyr)
library(hflights)
“Beş Büyükler”
dplyr
paketi içinde birçok fonksiyon bulunsa da bunlardan beş tanesi paketin temelini oluşturmaktadır. “Beş büyükler” olarak nitelendirebileceğimiz fonksiyonları sayesinde dplyr
paketi verinin düzgün bir şekilde manipülasyonu olanaklı kılar. Bu fonksiyonların isimlerini ve açıklamalarını aşağıda bulabilirsiniz.
select()
fonksiyonu sütunlar/değişkenler arasından istediklerimizi seçer filter()
fonksiyonu satırlar/gözlemler arasından istediklerimizi seçer, arrange()
fonksiyonu değişkenlere göre sütunları organize eder, mutate()
fonksiyonu veri tabanındaki sütun/değişkenleri kullanrak aynı veritanabına yeni sütun/değişken ekler ve, summarise()
fonksiyonu istenilen kriterlere göre gözlemleri gruplar.
Bu bölümdeki işlemlerde hflights
paketi içerisinde bulunan “hflights” isimli veri tabanını kullanacağımızdan aynı işlemleri bu paket için de yapmamız gerekiyor. Bu veri tabanında 2011 yılında Houston havaalanından kalkmış tüm uçaklara ait, iptal ve gecikme gibi veriler bulunuyor.
“hflights” veri tabanını konsol üzerinden çağırıp yapısına bakmak mümkün olsa da, bu veri tabanı 250 binden fazla gözlem içerdiğinden sonuç raporu bizim için çok kullanışlı olmayacaktır. Bu noktada dplyr
paketinin tbl_df()
fonksiyonunu kullanarak bu veri tabanını daha önce gördüğümüz “tibble/tbl” formatına çevirip, daha anlamlı bir rapor oluşturabiliriz.
hflights <- tbl_df(hflights)
hflights
## # A tibble: 227,496 x 23
## Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
## * <int> <int> <int> <int> <int> <int> <chr> <int>
## 1 2011 1 1 6 1400 1500 AA 428
## 2 2011 1 2 7 1401 1501 AA 428
## 3 2011 1 3 1 1352 1502 AA 428
## 4 2011 1 4 2 1403 1513 AA 428
## 5 2011 1 5 3 1405 1507 AA 428
## 6 2011 1 6 4 1359 1503 AA 428
## 7 2011 1 7 5 1359 1509 AA 428
## 8 2011 1 8 6 1355 1454 AA 428
## 9 2011 1 9 7 1443 1554 AA 428
## 10 2011 1 10 1 1443 1553 AA 428
## # ... with 227,486 more rows, and 15 more variables: TailNum <chr>,
## # ActualElapsedTime <int>, AirTime <int>, ArrDelay <int>,
## # DepDelay <int>, Origin <chr>, Dest <chr>, Distance <int>,
## # TaxiIn <int>, TaxiOut <int>, Cancelled <int>, CancellationCode <fct>,
## # Diverted <int>, Carrier <chr>, Code <chr>
Oluşan rapordan veri tabanında kaç satır/gözlem ve sütun/değişken bulunduğunu (227,496 x 21), değişkenlerin isimlerini rahatlıkla anlayabiliyoruz.
Veri tabanını daha anlaşılır hale getirmek her zaman avantajınıza olur. Bir örnek olarak hflights veri tabanında bulunan uçak firmaları isimlerini kod halinde saklamış veriyi firmaların açık isimleri haline getirelim. Bu işlem için öncelikli olarak firmalara ait açık isimlerin bulunduğu bir vektöre gereksinimimiz var. Aşağıdaki kod bu işlemi gerçekleştiriyor ve vektörü “lut” ismi ile kaydediyor
lut <- c("AA" = "American", "AS" = "Alaska", "B6" = "JetBlue", "CO" = "Continental",
"DL" = "Delta", "OO" = "SkyWest", "UA" = "United", "US" = "US_Airways",
"WN" = "Southwest", "EV" = "Atlantic_Southeast",
"F9" = "Frontier", "FL" = "AirTran",
"MQ" = "American_Eagle", "XE" = "ExpressJet", "YV" = "Mesa")
İkinci aşamada ise oluşan isim vektörümüzü veri tabanındaki ilgili sütun/değişken (UniqueCarrier) ile eşleştirip yeni bir sütun/değişken olarak (Carrier) veri tabanına eklememiz gerekiyor:
hflights$Carrier <- lut[hflights$UniqueCarrier]
glimpse(hflights)
## Observations: 227,496
## Variables: 23
## $ Year <int> 2011, 2011, 2011, 2011, 2011, 2011, 2011, 20...
## $ Month <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,...
## $ DayofMonth <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1...
## $ DayOfWeek <int> 6, 7, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6,...
## $ DepTime <int> 1400, 1401, 1352, 1403, 1405, 1359, 1359, 13...
## $ ArrTime <int> 1500, 1501, 1502, 1513, 1507, 1503, 1509, 14...
## $ UniqueCarrier <chr> "AA", "AA", "AA", "AA", "AA", "AA", "AA", "A...
## $ FlightNum <int> 428, 428, 428, 428, 428, 428, 428, 428, 428,...
## $ TailNum <chr> "N576AA", "N557AA", "N541AA", "N403AA", "N49...
## $ ActualElapsedTime <int> 60, 60, 70, 70, 62, 64, 70, 59, 71, 70, 70, ...
## $ AirTime <int> 40, 45, 48, 39, 44, 45, 43, 40, 41, 45, 42, ...
## $ ArrDelay <int> -10, -9, -8, 3, -3, -7, -1, -16, 44, 43, 29,...
## $ DepDelay <int> 0, 1, -8, 3, 5, -1, -1, -5, 43, 43, 29, 19, ...
## $ Origin <chr> "IAH", "IAH", "IAH", "IAH", "IAH", "IAH", "I...
## $ Dest <chr> "DFW", "DFW", "DFW", "DFW", "DFW", "DFW", "D...
## $ Distance <int> 224, 224, 224, 224, 224, 224, 224, 224, 224,...
## $ TaxiIn <int> 7, 6, 5, 9, 9, 6, 12, 7, 8, 6, 8, 4, 6, 5, 6...
## $ TaxiOut <int> 13, 9, 17, 22, 9, 13, 15, 12, 22, 19, 20, 11...
## $ Cancelled <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
## $ CancellationCode <fct> E, E, E, E, E, E, E, E, E, E, E, E, E, E, E,...
## $ Diverted <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
## $ Carrier <chr> "American", "American", "American", "America...
## $ Code <chr> "iptal yok", "iptal yok", "iptal yok", "ipta...
Çıkan raporda son sıradaki “Carrier” ve yedinci sıradaki “UniqueCarrier” değişkenlerini incelediğinizde yaptığımız işlem daha net olarak görebilirsiniz.
Benzer bir işlemi de uçakların iptal nedenlerini anlatan ama bunları açık haliyle değil sadece birer harf olarak kodlamış olan “CancellationCode” değişkeni için yapalım. Amacımız iptal kodlarını açık ve anlaşılır hale getirmek. Yukarıdaki işlemi bu değişken için tekrarlayan aşağıdaki kodu inceleyiniz.
lut2 <- c("A" = "iptal yok", "B" = "firma", "C" = "hava",
"D" = "teknik", "E" = "guvenlik")
hflights$Code <- lut2[hflights$CancellationCode]
glimpse(hflights)
## Observations: 227,496
## Variables: 23
## $ Year <int> 2011, 2011, 2011, 2011, 2011, 2011, 2011, 20...
## $ Month <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,...
## $ DayofMonth <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1...
## $ DayOfWeek <int> 6, 7, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6,...
## $ DepTime <int> 1400, 1401, 1352, 1403, 1405, 1359, 1359, 13...
## $ ArrTime <int> 1500, 1501, 1502, 1513, 1507, 1503, 1509, 14...
## $ UniqueCarrier <chr> "AA", "AA", "AA", "AA", "AA", "AA", "AA", "A...
## $ FlightNum <int> 428, 428, 428, 428, 428, 428, 428, 428, 428,...
## $ TailNum <chr> "N576AA", "N557AA", "N541AA", "N403AA", "N49...
## $ ActualElapsedTime <int> 60, 60, 70, 70, 62, 64, 70, 59, 71, 70, 70, ...
## $ AirTime <int> 40, 45, 48, 39, 44, 45, 43, 40, 41, 45, 42, ...
## $ ArrDelay <int> -10, -9, -8, 3, -3, -7, -1, -16, 44, 43, 29,...
## $ DepDelay <int> 0, 1, -8, 3, 5, -1, -1, -5, 43, 43, 29, 19, ...
## $ Origin <chr> "IAH", "IAH", "IAH", "IAH", "IAH", "IAH", "I...
## $ Dest <chr> "DFW", "DFW", "DFW", "DFW", "DFW", "DFW", "D...
## $ Distance <int> 224, 224, 224, 224, 224, 224, 224, 224, 224,...
## $ TaxiIn <int> 7, 6, 5, 9, 9, 6, 12, 7, 8, 6, 8, 4, 6, 5, 6...
## $ TaxiOut <int> 13, 9, 17, 22, 9, 13, 15, 12, 22, 19, 20, 11...
## $ Cancelled <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
## $ CancellationCode <fct> E, E, E, E, E, E, E, E, E, E, E, E, E, E, E,...
## $ Diverted <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
## $ Carrier <chr> "American", "American", "American", "America...
## $ Code <chr> "iptal yok", "iptal yok", "iptal yok", "ipta...
8.1 select()
fonksiyonu
Uçuşlardaki ortalama gecikmeyi hesaplamaya çalıştığımızı düşünelim. Elimizdeki veri tabanında bulunan değişkenlerden sadece birkaçını kullanarak bu soruyu cevaplayabiliriz. İhtiyacımız olan değişkenleri seçmek için select()
fonksiyonunu kullanacağız. Bu fonksiyonun kullanımı aşağıdaki gibidir.
select(veri_tabanı, değişken1, değişken2)
select()
fonksiyonu aynı zamanda :
ve -
ifadeleri ile de kullanılabilir. Aşağıdaki kod veri tabanın birinci sütunundan dördüncü sütununa kadar olan kısmını, ikinci sütun/değişken dışarıda bırakılarak, seçilmesini sağlar. Sütun/değişken numaraları yerine isimleri de kullanılabilir.
select(veri_tabanı, 1:4, -2)
select()
seçim yaptığınız orjinal veri tabanında bir değişikliğe yol açmaz. Dolayısıyla yaptığınız seçimleri ayrı bir R objesi halinde saklamak uygun olacaktır.
names()
komutu ile veri tabanımızdaki değişkenlere bir göz atalım.
names(hflights)
## [1] "Year" "Month" "DayofMonth"
## [4] "DayOfWeek" "DepTime" "ArrTime"
## [7] "UniqueCarrier" "FlightNum" "TailNum"
## [10] "ActualElapsedTime" "AirTime" "ArrDelay"
## [13] "DepDelay" "Origin" "Dest"
## [16] "Distance" "TaxiIn" "TaxiOut"
## [19] "Cancelled" "CancellationCode" "Diverted"
## [22] "Carrier" "Code"
Bu değişkenlerden “Year” (yıl) ve “DayOfWeek” (haftanın günü) değişkenleri arasındaki tüm değişkenleri seçip “s1” olarak tanımlamak istediğimizde aşağıdaki kodu kullanırız.
s1 <- dplyr::select(hflights, Year:DayOfWeek)
s1
## # A tibble: 227,496 x 4
## Year Month DayofMonth DayOfWeek
## * <int> <int> <int> <int>
## 1 2011 1 1 6
## 2 2011 1 2 7
## 3 2011 1 3 1
## 4 2011 1 4 2
## 5 2011 1 5 3
## 6 2011 1 6 4
## 7 2011 1 7 5
## 8 2011 1 8 6
## 9 2011 1 9 7
## 10 2011 1 10 1
## # ... with 227,486 more rows
dplyr
select()
fonksiyonu için bir grup yardımcı fonksiyon da içerir. Bu fonksiyonlar sayesinde değişkenler içerisinden daha detaylı ayıklamalar yapılabilir. Yardımcı fonksiyonların listesini aşağıda bulabilirsiniz. Dikkat edilmesi gereken nokta bu yardımcı fonksiyonlarım çift tırnak (“”) ile beraber kullanılması gerekliliğidir.
starts_with("X")
: “X” ile başlayan değişkenler,ends_with("X")
: “X” ile biten değişkenler,contains("X")
: “X” içeren değişkenlermatches("X")
: “X” ifadesini içeren değişkenler,num_range("x", 1:5)
: x01, x02, x03, x04 and x05 şeklinde kayıtlı değişkenler.
İçinde “Delay” (gecikme) geçen değişkenleri yardımcı fonksiyon kullanarak bulup d1 ismi ile tanımlayalım.
d1 <- dplyr::select(hflights, contains("Delay"))
d1
## # A tibble: 227,496 x 2
## ArrDelay DepDelay
## * <int> <int>
## 1 -10 0
## 2 -9 1
## 3 -8 -8
## 4 3 3
## 5 -3 5
## 6 -7 -1
## 7 -1 -1
## 8 -16 -5
## 9 44 43
## 10 43 43
## # ... with 227,486 more rows
Görüldüğü üzere içinde aradığımız kelime geçen iki değişkeni fonksiyonumuz d1 adı ile ayrı bir R nesnesi olarak tanımladı.
8.2 mutate()
fonksiyonu
Bu bölümde ikinci olarak inceleyeceğimiz mutate()
fonksiyonu veri tabanına yeni değişkenler eklemek istediğimiz zaman kullanılır ve yazımı aşağıdaki gibidir:
mutate(veri_tabani, yeni_değişken = değişken1 + değişken2)
Bu örnekte veri tabanında bulunan iki değişken toplanılarak yeni bir değişken üretiliyor. Yeni değişken üretiminde sadece toplama değil istenen her türlü işlem yapılabilir. Aynı select()
fonksiyonunda olduğu gibi, bu fonksiyonda da yaptığınız işlemi ayrı bir R nesnesi (ki bu durumda bir veri tabanı/data frame/ tbl formatında) olarak kaydetmenizi öneririm.
Yolcuların uçmadan önce yerde geçirdikleri zamanı hesap etmeye çalışalım. hflights veri tabanında bulunan ve yolculukta geçirilen tüm zamanı belirten “ActualElapsedTime” (Yolculukta geçen toplam zaman) değişkeninden, sadece havada geçen zamanı belirten “AirTime” (Havada geçen zaman) değişkenini çıkartıp, oluşan yeni değişkeni “ActualGroundTime” (Yerde geçen zaman) değişkeni olarak “g1” isimli yeni veri tabanına kaydeden kodu aşağıda bulabilirsiniz.
g1 <- mutate(hflights, ActualGroundTime = AirTime - ActualElapsedTime)
g1
## # A tibble: 227,496 x 24
## Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
## <int> <int> <int> <int> <int> <int> <chr> <int>
## 1 2011 1 1 6 1400 1500 AA 428
## 2 2011 1 2 7 1401 1501 AA 428
## 3 2011 1 3 1 1352 1502 AA 428
## 4 2011 1 4 2 1403 1513 AA 428
## 5 2011 1 5 3 1405 1507 AA 428
## 6 2011 1 6 4 1359 1503 AA 428
## 7 2011 1 7 5 1359 1509 AA 428
## 8 2011 1 8 6 1355 1454 AA 428
## 9 2011 1 9 7 1443 1554 AA 428
## 10 2011 1 10 1 1443 1553 AA 428
## # ... with 227,486 more rows, and 16 more variables: TailNum <chr>,
## # ActualElapsedTime <int>, AirTime <int>, ArrDelay <int>,
## # DepDelay <int>, Origin <chr>, Dest <chr>, Distance <int>,
## # TaxiIn <int>, TaxiOut <int>, Cancelled <int>, CancellationCode <fct>,
## # Diverted <int>, Carrier <chr>, Code <chr>, ActualGroundTime <int>
R raporundan da anlaşılacağı gibi ActualGroundTime değişkenimiz son olarak veri tabanına eklendi. mutate()
fonksiyonunun bir başka özelliği ise ihtiyaç duyulduğunda aynı anda aynı kodun içerisinde birden fazla yeni değişken üretebilmesidir. Aşağıdaki kodu kullanarak kendiniz aynı anda yeni değişkenler yaratmayı deneyebilirsiniz.
mutate(veri_tabani, yeni_değişken1 = değişken1 + değişken2, yeni_değişken2 = değişken3 * değişken4)
8.3 filter()
fonksiyonu
filter()
fonksiyonu veri tabanındaki satırları/gözlemleri istenilen şekilde filtrelemek için kullanılır. Yani bir bakıma sütunlar/değişkenleri ayıklamak için kullanılan select()
fonksiyonunun satırlar/gözlemler için kullanılan halidir. filter()
ile sadece seçtiğimiz gözlemlerden oluşan yeni bir veri tabanı oluşturmuş oluruz.
filter()
fonksiyonu ile hflights veri tabanını kullanarak iptal edilmiş uçuşların sayısını bulmaya çalışalım. Bu iş için öncelikle uçuş iptali ile ilgili bilgiyi içeren sütunu/değişkeni saptamamız gerekiyor. Bu verinin hflights veri tabanındaki “Cancelled” (İptal edilmiş) sütununda/değişkeninde “1” ve “0” kodları ile kodlandığını görüyoruz. Değişkendeki “1” değeri uçuşun iptal edildiğini “0” değeri ise iptal edilmediğini ifade ediyor. Aynı select()
fonksiyonunda olduğu gibi bu fonksiyonda da yeni oluşan veri tabanını yeni bir isimle kaydetmenizi öneririm. Aşağıdaki koda bir göz atalım:
iptaller <- filter(hflights, Cancelled == 1)
iptaller
## # A tibble: 2,973 x 23
## Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
## <int> <int> <int> <int> <int> <int> <chr> <int>
## 1 2011 1 24 1 NA NA AA 1700
## 2 2011 1 9 7 NA NA AA 1820
## 3 2011 1 11 2 NA NA B6 624
## 4 2011 1 19 3 NA NA B6 624
## 5 2011 1 27 4 NA NA B6 624
## 6 2011 1 31 1 NA NA CO 442
## 7 2011 1 31 1 NA NA CO 500
## 8 2011 1 31 1 NA NA CO 1711
## 9 2011 1 29 6 NA NA CO 408
## 10 2011 1 28 5 NA NA CO 158
## # ... with 2,963 more rows, and 15 more variables: TailNum <chr>,
## # ActualElapsedTime <int>, AirTime <int>, ArrDelay <int>,
## # DepDelay <int>, Origin <chr>, Dest <chr>, Distance <int>,
## # TaxiIn <int>, TaxiOut <int>, Cancelled <int>, CancellationCode <fct>,
## # Diverted <int>, Carrier <chr>, Code <chr>
Görüldüğü gibi filter()
fonksiyonu veri tabanının ismi ile beraber bizden bir mantıksal test ifadesi ister. Bu mantıksal test yukarıdaki örnekte “Cancelled==1”, yani iptal edilmiş uçuşlar şeklinde ifade edilmiş. Sonuçta da bu mantıksal kontrole dayanarak oluşan “iptaller” isimli veri tabanına “Cancelled” değişkeninin sadece “1” olarak kodlandığı gözlemler seçilmiş oldu. Oluşan rapordan, raporun üst kısmındaki satır sayısına dayanarak, toplamda 2973 uçuşun iptal olduğu bilgisini de elde ediyoruz.
filter()
fonksiyonundan tam anlamıyla yararlanmak için eşit “==”, eşit değil “!=”, büyük “>”, küçük “<”, büyük eşit “>=” vb. mantıksal operatörlerin iyi bilinmesi gerekir. Bu operatörlerin detaylı açıklamalarına konsola “?Comparison” yazarak ulaşabilirsiniz. filter()
fonksiyonunun bir başka özelliği de birden fazla mantıksal testi aynı anda çalıştırarak satır/gözlem seçimini yapabilmesidir. Aşağıdaki örnekte a değişkeninin 0 değerinden büyük olduğu, b değişkeninin 3 değerinden küçük veya eşit olduğu ve c değişkeninin “NA”/kayıp veri olarak kodlanmadığı gözlemleri seçen kodu bulabilirsiniz.
filter(veri_tabanı, a>0, b<=3, !is.na(c))
8.4 arrange()
fonksiyonu
arrange()
fonksiyonu satırları/gözlemleri içeriklerine göre sıralamak için kullanılır. Böylece veri tabanınızı hem istenilen kriterde sıralamış, hem de sadece verinin üst kısmına bakarak değişkenler arasındaki ilişkiyi görme şansını elde etmiş olursunuz. arrange()
fonksiyonun kullanımı gayet kolaydır; fonksiyonun içine sadece veri tabanının ismini ve sıralama için kullanacağınız değişkeni tanımlamanız yeterli olur. Aşağıdaki kod önce hflights veri tabanından 3 değişkeni (içerisinde “Delay” kelimesi olanlar ve uçak kuyruk numarasını belirten “TailNum” değişkenleri) “gecikme” isimli yeni bir veri tabanına taşıyor, ve “gecikme” isimli veri tabanındaki “DepDelay” (Kalkıştaki gecikme) değişkenini kullanarak sıralamayı gerçekleştiriyor:
gecikme <- dplyr::select(hflights, TailNum, contains("Delay"))
arrange(gecikme, DepDelay)
## # A tibble: 227,496 x 3
## TailNum ArrDelay DepDelay
## <chr> <int> <int>
## 1 N728SK -25 -33
## 2 N648MQ -23 -23
## 3 N13908 -12 -19
## 4 N11107 -40 -19
## 5 N27610 -17 -18
## 6 N134EV -31 -18
## 7 N14960 -15 -17
## 8 N14604 -9 -17
## 9 N13995 -17 -17
## 10 N502MQ -23 -17
## # ... with 227,486 more rows
Yukarıda oluşan raporda bulunan gözlemlerdeki “-” değerlerden anlaşılacağı üzere bazı uçaklar belirtildiği saatlerden erken havalanmışlar. Hatta en üstteki gözleme göre bunlardan bir tanesi uçuş vaktinden 33 dakika önce havalanmış! Gene rapordan bazı gözlemlerin sıralandığında aynı değerlere sahip olduğunu anlıyoruz; örneğin yedinci ve onuncu gözlemler arası “DepDelay” değişkeni -17 değerini almış. arrange()
ile bir başka değişkeni işe katarak bu eşitliği kendi içinde sıralayabiliriz:
arrange(gecikme, DepDelay, ArrDelay)
## # A tibble: 227,496 x 3
## TailNum ArrDelay DepDelay
## <chr> <int> <int>
## 1 N728SK -25 -33
## 2 N648MQ -23 -23
## 3 N11107 -40 -19
## 4 N13908 -12 -19
## 5 N134EV -31 -18
## 6 N27610 -17 -18
## 7 N14943 -33 -17
## 8 N879AS -32 -17
## 9 N368NB -31 -17
## 10 N26215 -28 -17
## # ... with 227,486 more rows
arrange()
sıralamayı önceden tanımlı/default olarak küçükten büyüğe yapar. Sıralamayı büyükten küçüğe yapmak için, arrange()
içerisinde desc()
fonksiyonun kullanılması gerekir. İlk yaptığımız sıralamayı büyükten küçüğe yapalım:
gecikme <- dplyr::select(hflights, TailNum, contains("Delay"))
arrange(gecikme, desc(DepDelay))
## # A tibble: 227,496 x 3
## TailNum ArrDelay DepDelay
## <chr> <int> <int>
## 1 N69063 957 981
## 2 N473AA 978 970
## 3 N502MQ 918 931
## 4 N670UA 861 869
## 5 N6EAMQ 793 814
## 6 N609MQ 822 803
## 7 N74856 775 780
## 8 N75861 766 758
## 9 N764NC 701 730
## 10 N651MQ 704 691
## # ... with 227,486 more rows
8.5 summarise()
fonksiyonu ve pipe/aktarım operatörü
Beş büyüklerin sonuncusu olan summarise()
(özetle) fonksiyonu verinizi inceleyerek değişkenlerinizi betimleyen özet istatistiki bilgileri içeren ufak veri tabanları oluşturmaya yarar. Hangi istatistiki bilgileri özetlemek istediğine ise kullanıcı kendi karar verir. Örneğin summarise()
ile rötar bilgileri hakkında en yüksek, en düşük ve ortalama değerleri özetleyen bir veri tabanı yaratabiliriz.
summarise()
fonksiyonunun yazımı mutate()
fonksiyonuna benzer. İlk başta veri tabanının ismi yazılır, daha sonra ise istenen istatistiki testler sütun/değişken isimleri ile beraber fonksiyona eklenir.
`summarise(veri_tabanı, toplam = sum(A), ortalama = mean(B), varyans = var(C))`
Yukarıdaki kod ilgili veri tabanını kullanarak A değişkenine ait toplamı, B değişkenine ait ortalamayı ve C değişkenine ait varyansı hesaplayıp “toplam”, “ortalama” ve “varyans” isimli sütunlara yerleştirir. Formülde kullanılan sum()
, mean()
, ve var()
fonksiyonları temel R içinde gelen toplam, ortalama ve varyans hesaplamaya yarayan fonksiyonlardır. Bir önceki örnekte “gecikme” ismi ile kaydettiğimiz veri tabanı üzerinde summarise()
fonksiyonunu kullanan aşağıdaki örneği inceleyelim
gecikme <- filter(gecikme, !is.na(DepDelay))
summarise(gecikme, en_az = min(DepDelay), ortalama = mean(DepDelay), en_fazla = max(DepDelay))
## # A tibble: 1 x 3
## en_az ortalama en_fazla
## <dbl> <dbl> <dbl>
## 1 -33 9.44 981
Kodda ilk adım olarak “DepDelay” değişkeni içinden NA/kayıp veri içeren gözlemleri eledik. Daha sonra ise min()
en az, mean()
ve max()
en fazla fonksiyonlarını kullanarak verimiz hakkında ufak bir özet hazırladık. Sonucu raporda görebilirsiniz.
Bu noktadadplyr
paketindeki fonksiyonları bir zincir halinde beraber kullanmanın avantajlı olacağını düşünüyor olabilirsiniz. Örneğin aynı veri tabanında filter()
, mutate()
, select()
, arrange()
ve summarise()
fonksiyonlarını aynı anda tek bir kod halinde kullanmak yapılacak işi hem daha kolay hem de daha anlaşılır hale getirecektir. pipe
operatörü tam da bu işe yarar. %>%
ile ifade edilen pipe
operatörü R nesnesi ile fonksiyonun arasına yerleşerek solunda yer alan R nesnesini alıp sağında yer alan kullanılacak fonksiyonun içerisine yerleştirir. Aşağıdaki örneği inceleyiniz
a %>%
select(X, Y, Z) %>%
filter(X > Y) %>%
mutate(Q= X+Y+Z) %>%
summarise(all = sum(Q))
Yukarıda kullanılmış olan %>%
işaretini “sonra” diye okuyabiliriz: a veri tabanını al, sonra X Y ve Z değişkenlerini seç, sonra X’in Y’den büyük olduğu gözlemleri filtrele, sonra X Y ve Z değişkenlerinin toplamı olan Q değişkenini hesapla sonra Q değişkenini toplayarak özetle.
Uçakla mı kara yoluyla mı gidelim? Gelin bu sorunun cevabını hflights veri tabanını kullanarak bulmaya çalışalım. Ortalama hızı araba ile gitmekten daha düşük olan uçuşları bulmak için aşağıdaki adımları tek bir kod halinde yazmaya çalışalım.
- “ActualElapsedTime” değişkenine 100 dakika ekleyen ve uçak yolculuğunda havaalanına gitmek vb gibi zaman alan adımlarını da hesaba katan “gercek_zaman” isimli ve
- Gidelecek uzaklığı “gercek_zaman” değişkenine bölüp 60 ile çarparak yolculuk sırasındaki saatteki hızımızı ölçen “saatteki_hiz” değişkenlerini yaratalım.
Daha sonra “saateki_hiz” değişkenimizdeki NA/kayıp veri içeren ve 70 değerinden daha küçük olan gözlemleri ayıklayalım.
Son olarak da, gözlem sayısını “gozlem”, varış noktalarının sayısını “varis”, en yakın mesafeyi “en_yakin” ve en uzak mesafeyi “en_uzak” sütunlarında tanımlayan veri tabanını oluşturalım
hflights %>%
mutate(gercek_zaman = ActualElapsedTime + 100,
saateki_hiz = Distance / gercek_zaman * 60) %>%
filter(!is.na(saateki_hiz), saateki_hiz < 70) %>%
summarise(gozlem = n(),
varis = n_distinct(Dest),
en_yakin = min(Distance),
en_uzak = max(Distance))
## # A tibble: 1 x 4
## gozlem varis en_yakin en_uzak
## <int> <int> <dbl> <dbl>
## 1 6726 13 79 305
Sonuçlardan 12 uçuşun araba ile gitmekten daha yavaş olduğunu anlıyoruz.
summarise()
ile tüm veri tabanı üzerindeki gözlemleri istatistiki olarak özetlemenin mümkün olduğunu gördük. Fakat analizlerde çoğu zaman gözlemleri oluşturan farklı gruplara ait istatistiki özetlere gereksinim duyarız. dplyr
grup bazlı bu özetleri group_by()
fonksiyonu ile oluşturur. Havayolu şirketlerini yaptıkları gecikmelere göre karşılatırıp sıralayan aşağıdaki kodu inceleyiniz
hflights %>%
group_by(UniqueCarrier) %>%
summarise(p_canc = mean(Cancelled == 1) * 100,
avg_delay = mean(ArrDelay, na.rm = TRUE)) %>%
arrange(avg_delay, p_canc)
## # A tibble: 15 x 3
## UniqueCarrier p_canc avg_delay
## <chr> <dbl> <dbl>
## 1 US 1.13 -0.631
## 2 AA 1.85 0.892
## 3 FL 0.982 1.85
## 4 AS 0 3.19
## 5 YV 1.27 4.01
## 6 DL 1.59 6.08
## 7 CO 0.678 6.10
## 8 MQ 2.90 7.15
## 9 EV 3.45 7.26
## 10 WN 1.55 7.59
## 11 F9 0.716 7.67
## 12 XE 1.55 8.19
## 13 OO 1.39 8.69
## 14 B6 2.59 9.86
## 15 UA 1.64 10.5
Yukarıdaki kod ilk başta hflights veri tabanini çağırıyor. Daha sonra farklı firmaların isimlerini içeren “UniqueCarrier” değişkenini kullanarak grupluyor. Bu gruplama üzerinden iptal yüzdesini hesaplayan “p_canc” ve ortalama gecikmeyi hesaplayan “avg_delay” isimli iki yeni değişkeni özetleyip ortalama gecikmeye göre sıraya sokuyor. Sonuçtan “UA” United Airlines firmasının en fazla geciken firma olduğu ortaya çıkıyor.