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


filt<-filter(airquality, Temp>65 & Ozone>25)
tail(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 ...
ss<-arrange(swiss, Fertility)
head(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
mt2<-group_by(mtcars,cyl)
summarise(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.