Bölüm8 DPLYR
Data frame’ler, analizlerde sıklıkla kullandığımız ve ustalıkla yönetebilmemiz gereken veri yapılarıdır. Ders kapsamında data frameler üzerine bazı kodlamalar ve değerlendirmeler yaptık, dplyr
paketi kapsamında ise bu uygulamaların kolaylığı için önerilen yapılardan bahsedeceğiz.
dplyr
paketi, RStudio’dan Hadley Wickham tarafından geliştirilmiştir ve onun plyr
paketinin optimize edilmiş ve sadeleştirilmiş bir versiyonudur. dplyr
paketi ile elde edilecek tüm sonuçlar temel R yapısı ile elde edilebilir, bu bakımdan dplyr
paketi bir yenilik getirmemektedir, paketin katkısı bu elde etme sürecini kolaylaştırmaktır.
Bu kapsamda bahsedeğimiz yapılar;
- select
- filter
- arrange
- rename
- mutate
- summarise
- %>% (pipe operator)
Yapılması gereken ilk adım tabi ki paketi indirmek ve kütüphaneden çekmek olmalıdır.
Paket yüklendiğinde bazı uyarılar alabilirsiniz çünkü dplyr
paketinde diğer paketlerdeki fonksiyonlarla aynı adı taşıyan fonksiyonlar vardır. Şimdilik uyarıları görmezden gelebilirsiniz.
select()
Büyük veri setleri ile çalışırken select
fonksiyonu yardımıyla istenilen değişkenleri seçebilir, veya belirli bir özelliğe göre değişken filtreleme yapabilirsiniz.
data("airquality")
dim(airquality)
## [1] 153 6
str(airquality)
## 'data.frame': 153 obs. of 6 variables:
## $ Ozone : int 41 36 12 18 NA 28 23 19 8 NA ...
## $ Solar.R: int 190 118 149 313 NA NA 299 99 19 194 ...
## $ Wind : num 7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
## $ Temp : int 67 72 74 62 56 66 65 59 61 69 ...
## $ Month : int 5 5 5 5 5 5 5 5 5 5 ...
## $ Day : int 1 2 3 4 5 6 7 8 9 10 ...
153 gözlem ve 6 değişkenden oluşan bu veri setinde Month ve Day değişkenleri üzerine çalışmak istenildiğini varsayalım;
library(dplyr)
head(select(airquality, Month, Day))
## Month Day
## 1 5 1
## 2 5 2
## 3 5 3
## 4 5 4
## 5 5 5
## 6 5 6
head(select(airquality, Ozone:Temp))
## Ozone Solar.R Wind Temp
## 1 41 190 7.4 67
## 2 36 118 8.0 72
## 3 12 149 12.6 74
## 4 18 313 11.5 62
## 5 NA NA 14.3 56
## 6 28 NA 14.9 66
filter()
Büyük veri setleri ile çalışırken filter
fonksiyonu yardımıyla istenilen gözlemleri seçebilir, veya belirli bir özelliğe göre gözlem filtreleme yapabilirsiniz.
head(filter(airquality, Temp>65))
## Ozone Solar.R Wind Temp Month Day
## 1 41 190 7.4 67 5 1
## 2 36 118 8.0 72 5 2
## 3 12 149 12.6 74 5 3
## 4 28 NA 14.9 66 5 6
## 5 NA 194 8.6 69 5 10
## 6 7 NA 6.9 74 5 11
<-filter(airquality, Temp>65 & Ozone>25)
filttail(select(filt, Wind, Day))
## Wind Day
## 60 15.5 6
## 61 14.9 11
## 62 6.3 13
## 63 6.9 16
## 64 10.3 23
## 65 6.9 26
arrange()
Gözlemlerin değişkene bağlı olarak sıralanması amacıyla kullanılan fonksiyon arrange
’dir.
str(swiss)
## 'data.frame': 47 obs. of 6 variables:
## $ Fertility : num 80.2 83.1 92.5 85.8 76.9 76.1 83.8 92.4 82.4 82.9 ...
## $ Agriculture : num 17 45.1 39.7 36.5 43.5 35.3 70.2 67.8 53.3 45.2 ...
## $ Examination : int 15 6 5 12 17 9 16 14 12 16 ...
## $ Education : int 12 9 5 7 15 7 7 8 7 13 ...
## $ Catholic : num 9.96 84.84 93.4 33.77 5.16 ...
## $ Infant.Mortality: num 22.2 22.2 20.2 20.3 20.6 26.6 23.6 24.9 21 24.4 ...
<-arrange(swiss, Fertility)
sshead(select(ss, Fertility, Education),5)
## Fertility Education
## V. De Geneve 35.0 53
## Rive Gauche 42.8 29
## Rive Droite 44.7 29
## La Vallee 54.3 20
## Lausanne 55.7 28
rename()
Data frame yapısında mevcut bir değişkenin ismini değiştirmenin kolay yolu rename
fonksiyonunu kullanmaktır.
head(swiss)
## Fertility Agriculture Examination Education Catholic
## Courtelary 80.2 17.0 15 12 9.96
## Delemont 83.1 45.1 6 9 84.84
## Franches-Mnt 92.5 39.7 5 5 93.40
## Moutier 85.8 36.5 12 7 33.77
## Neuveville 76.9 43.5 17 15 5.16
## Porrentruy 76.1 35.3 9 7 90.57
## Infant.Mortality
## Courtelary 22.2
## Delemont 22.2
## Franches-Mnt 20.2
## Moutier 20.3
## Neuveville 20.6
## Porrentruy 26.6
Yapılacak tanımlamada eşitliği sol tarafı yeni tanımlanan değişken ismini, sağ tarafı ise mevcut değişken ismini temsil edecektir.
head(rename(swiss, fer=Fertility, ag=Agriculture))
## fer ag Examination Education Catholic Infant.Mortality
## Courtelary 80.2 17.0 15 12 9.96 22.2
## Delemont 83.1 45.1 6 9 84.84 22.2
## Franches-Mnt 92.5 39.7 5 5 93.40 20.2
## Moutier 85.8 36.5 12 7 33.77 20.3
## Neuveville 76.9 43.5 17 15 5.16 20.6
## Porrentruy 76.1 35.3 9 7 90.57 26.6
mutate()
Değişkenlere belirli işlemler uygulayarak veri setine eklemek için kullanışlı fonksiyonlardan biri mutate
’dir.
head(USArrests)
## Murder Assault UrbanPop Rape
## Alabama 13.2 236 58 21.2
## Alaska 10.0 263 48 44.5
## Arizona 8.1 294 80 31.0
## Arkansas 8.8 190 50 19.5
## California 9.0 276 91 40.6
## Colorado 7.9 204 78 38.7
head(mutate(USArrests,rateM=Murder/UrbanPop))
## Murder Assault UrbanPop Rape rateM
## Alabama 13.2 236 58 21.2 0.2275862
## Alaska 10.0 263 48 44.5 0.2083333
## Arizona 8.1 294 80 31.0 0.1012500
## Arkansas 8.8 190 50 19.5 0.1760000
## California 9.0 276 91 40.6 0.0989011
## Colorado 7.9 204 78 38.7 0.1012821
Yalnızca dönüştürdüğünüz veri setleri ile çalışmak istediğinizde kullanmanız gereken fonksiyon ise transmute
olacaktır.
head(transmute(USArrests,rateM=Murder/UrbanPop, cum=Murder/sum(Murder)))
## rateM cum
## Alabama 0.2275862 0.03389831
## Alaska 0.2083333 0.02568053
## Arizona 0.1012500 0.02080123
## Arkansas 0.1760000 0.02259887
## California 0.0989011 0.02311248
## Colorado 0.1012821 0.02028762
group_by() ve summarise()
Veriyi gruplayarak işlem yapılması gerektiğinde group_by
komutu işinizi görecektir. Yalnızca komutu çalıştırdığınızda gruplama için seçtiğiniz değişkende sıralama açısından değişiklik olmasını beklemeyin, sıralamanın değişmemesi gruplamanın yapılmadığı anlamına gelmez.
head(mtcars)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
<-group_by(mtcars,cyl)
mt2summarise(mt2,disp = mean(disp),hp = mean(hp))
## # A tibble: 3 x 3
## cyl disp hp
## * <dbl> <dbl> <dbl>
## 1 4 105. 82.6
## 2 6 183. 122.
## 3 8 353. 209.
%>%
Pipeline veya pipe operator olarak adlandırılan yapı kod yazımını ve anlaşılmasını kolaylaştırmak için önerilmiştir. Fazla sayıda iç içe komut yazımı verimli olmamakta, hem kodu yazan hem de inceleyen kişinin işini zorlaştırmaktadır. Yazım şekli en içten en dışa doğru olup aşağıda açıklanmaktadır;
third(second(first(x)))
first(x) %>% second %>% third
group_by(mtcars,cyl) %>% summarise(disp = mean(disp),hp = mean(hp))
## # A tibble: 3 x 3
## cyl disp hp
## * <dbl> <dbl> <dbl>
## 1 4 105. 82.6
## 2 6 183. 122.
## 3 8 353. 209.