Bu haftaki dersimizide dplyr
paketindeki bazı
fonksiyonların kullanımına devam ettik. Fonksiyonlara geçmeden hem veri
setini yüklemeli , hem de dplyr
paketini aktif hale
getirmeliyim.
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(tidyr)
library(tibble)
library(haven)
load("D:/OLC_731/Rders/import/PISA_COG_2018.rda")
load("D:/OLC_731/Rders/import/PISA_OGR_2018.rda")
load("D:/OLC_731/Rders/import/PISA_SCH_2018.rda")
load("D:/OLC_731/Rders/import/midiPISA.rda")
count fonksiyonu değişkenlerin frekans tablosunu elde etmek için kullanılır.
pipe (%>%) operatöüyle birlikte kullanılır.
midiPISA %>% count() # frekans hesaplanması
## # A tibble: 1 × 1
## n
## <int>
## 1 6890
midiPISA veri setinde 6890 adet gözlem olduğu anlaşılmaktadır.
# CINSIYET değişkenine frekans hesaplama
midiPISA %>% count(CINSIYET)
## # A tibble: 2 × 2
## CINSIYET n
## <dbl+lbl> <int>
## 1 1 [Kiz] 3396
## 2 2 [Erkek] 3494
Cinsiyet değişkenine göre kız öğrencilerin sayısı 3396, erkek öğrencilerin sayısı 3494’tür.
sort argümanıyla birlikte kullandığımızda frekans değerlerini çoktam aza doğru verir.
# CINSIYET değişkenine göre frekansların sıralanması
midiPISA %>% count(CINSIYET,sort=TRUE)
## # A tibble: 2 × 2
## CINSIYET n
## <dbl+lbl> <int>
## 1 2 [Erkek] 3494
## 2 1 [Kiz] 3396
Eğer SINIF ve CİNSİYET değişkenini aynı anda sıralamayla elde etmek istersek aşağıdaki kodu kullanabiliriz.
# CINSIYET ve SINIF değişkenlerine göre dağılımın sıralanması
midiPISA %>% count(CINSIYET,SINIF, sort=TRUE)
## # A tibble: 12 × 3
## CINSIYET SINIF n
## <dbl+lbl> <dbl+lbl> <int>
## 1 1 [Kiz] 10 [SINIF 10] 2707
## 2 2 [Erkek] 10 [SINIF 10] 2653
## 3 2 [Erkek] 9 [SINIF 9] 747
## 4 1 [Kiz] 9 [SINIF 9] 548
## 5 1 [Kiz] 11 [SINIF 11] 124
## 6 2 [Erkek] 11 [SINIF 11] 83
## 7 1 [Kiz] 8 [SINIF 8] 11
## 8 2 [Erkek] 8 [SINIF 8] 8
## 9 1 [Kiz] 12 [SINIF 12] 5
## 10 2 [Erkek] 7 [SINIF 7] 2
## 11 1 [Kiz] 7 [SINIF 7] 1
## 12 2 [Erkek] 12 [SINIF 12] 1
Belirli bir değişkene ilişkin toplam almak istenirse count() fonksiyonunun wt() argümanını kullanabiliriz.
# CINSIYET değişkenine göre gruplandırılmış veride SINIF değişkenine göre toplam frekans sayısı
midiPISA %>% count(SINIF, wt=CINSIYET, sort=TRUE)
## # A tibble: 6 × 2
## SINIF n
## <dbl+lbl> <dbl>
## 1 10 [SINIF 10] 8013
## 2 9 [SINIF 9] 2042
## 3 11 [SINIF 11] 290
## 4 8 [SINIF 8] 27
## 5 12 [SINIF 12] 7
## 6 7 [SINIF 7] 5
Örneğin, 11 sınıflarda toplam 290 öğrenci verisine sahibiz denebilir.
summarise fonksiyonu tek satırda veri setini özetler ve yeni bir veri seti oluşturur.
midiPISA %>%
summarise(mean(ODOKUMA1)) #ortalamanın hesaplanması
## # A tibble: 1 × 1
## `mean(ODOKUMA1)`
## <dbl>
## 1 464.
Bu veri setindeki ojuma puanalrının ortalamasının 464.2299 olduğunu söyleyebiliriz. Eğer veri setine dair daha fazla özetleyici biligiye ulaşmak istersek argümanlar arasında virgül koyarak aşağıdaki gibi hesaplama yapabiliriz.
midiPISA %>%
summarise(n = n(),
ortalama=mean(ODOKUMA1),
sd=sd(ODOKUMA1),
min=min(ODOKUMA1),
max=max(ODOKUMA1))
## # A tibble: 1 × 5
## n ortalama sd min max
## <int> <dbl> <dbl> <dbl> <dbl>
## 1 6890 464. 87.8 176. 772.
Veri setinde yer alan alt gruplar için istatiksel çıktılara ulaşmak için group_by kullanabiliriz.
midiPISA %>%
group_by(CINSIYET) %>%
summarise(n = n(),ortalama=mean(ODOKUMA1),sd=sd(ODOKUMA1),min=min(ODOKUMA1),max=max(ODOKUMA1))
## # A tibble: 2 × 6
## CINSIYET n ortalama sd min max
## <dbl+lbl> <int> <dbl> <dbl> <dbl> <dbl>
## 1 1 [Kiz] 3396 478. 83.7 236. 772.
## 2 2 [Erkek] 3494 451. 89.6 176. 747.
Cinsiyet değişkenine göre ortalama, standart sapma, min ve max değerler tablodan okunabilir.
Bu istatistiki verileri iki tane kategorik değişken için de hesaplayabiliriz. Cinsiyet ve sınıf düzeyi kategorik değişlnlerine göre çıktılara aşağıdaki gibi ulaşabiliriz.
betimsel <- midiPISA%>% # betimsel veri nesnesine atama
# CINSIYET ve SINIF değişkenlerine göre gruplara ayırma
group_by(CINSIYET,SINIF) %>%
# özetleyici bilgileri hesaplama
summarise(n = n(),ortalama=mean(ODOKUMA1),sd=sd(ODOKUMA1)) %>%
# gözlemleri ortalama değerleri büyükten küçüğe olacak şekilde sıralama
arrange(desc(ortalama))
## `summarise()` has grouped output by 'CINSIYET'. You can override using the
## `.groups` argument.
head(betimsel)
## # A tibble: 6 × 5
## # Groups: CINSIYET [2]
## CINSIYET SINIF n ortalama sd
## <dbl+lbl> <dbl+lbl> <int> <dbl> <dbl>
## 1 1 [Kiz] 10 [SINIF 10] 2707 482. 79.9
## 2 1 [Kiz] 11 [SINIF 11] 124 473. 85.0
## 3 1 [Kiz] 9 [SINIF 9] 548 462. 96.9
## 4 2 [Erkek] 10 [SINIF 10] 2653 459. 85.0
## 5 2 [Erkek] 11 [SINIF 11] 83 448. 87.9
## 6 2 [Erkek] 9 [SINIF 9] 747 422. 98.7
En yüksek ortalamaya 10.sınıflardaki kız öğrenciler sahiptir denilebilir. (482.2966)
summarise ve across fonksiyonlarını
birlikte kullanarak
summarise_at()
,summarise_all()
ve
summarise_if()
işlevlerinin aynısını yerine
getirebiliriz.
midiPISA %>%
summarise(across(everything(), list(mean = mean, sd = sd),na.rm=TRUE))
## Warning: There was 1 warning in `summarise()`.
## ℹ In argument: `across(everything(), list(mean = mean, sd = sd), na.rm =
## TRUE)`.
## Caused by warning:
## ! The `...` argument of `across()` is deprecated as of dplyr 1.1.0.
## Supply arguments directly to `.fns` through an anonymous function instead.
##
## # Previously
## across(a:b, mean, na.rm = TRUE)
##
## # Now
## across(a:b, \(x) mean(x, na.rm = TRUE))
## # A tibble: 1 × 32
## OGRENCIID_mean OGRENCIID_sd SINIF_mean SINIF_sd CINSIYET_mean CINSIYET_sd
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 79203623. 2087. 9.84 0.458 1.51 0.500
## # ℹ 26 more variables: Anne_Egitim_mean <dbl>, Anne_Egitim_sd <dbl>,
## # Baba_Egitim_mean <dbl>, Baba_Egitim_sd <dbl>, OKUMA_ZEVK_mean <dbl>,
## # OKUMA_ZEVK_sd <dbl>, ST097Q01TA_mean <dbl>, ST097Q01TA_sd <dbl>,
## # ST097Q02TA_mean <dbl>, ST097Q02TA_sd <dbl>, ST097Q03TA_mean <dbl>,
## # ST097Q03TA_sd <dbl>, ST097Q04TA_mean <dbl>, ST097Q04TA_sd <dbl>,
## # ST097Q05TA_mean <dbl>, ST097Q05TA_sd <dbl>, ODOKUMA1_mean <dbl>,
## # ODOKUMA1_sd <dbl>, ODOKUMA2_mean <dbl>, ODOKUMA2_sd <dbl>, …
Bu çıktıda her değişekndeki eksik veriler silinerek ortalamalarının alındığını görülmektedir.
Bir değişkenin en yüksek ya da en düşük değerini bulmak için kullanabiliriz.
df <- data.frame(x = c(10, 4, 1, 6, 3, 1, 1))
df %>% top_n(2)
## Selecting by x
## x
## 1 10
## 2 6
Okuma puanoı en yüksek 5 kız ve 5 erkek öğrenciye ait bilgiler aşağıdaki gibidir.
midiPISA %>%
# CINSIYET ve okuma olası değer1 değişkenlerinin seçilmesi
select(CINSIYET,ODOKUMA1)%>%
# büyükten küçüğe okuma puanlarının sıralanması
arrange(desc(ODOKUMA1))%>%
# CINSIYET değişkenine göre verinin gruplandırılması
group_by(CINSIYET) %>%
# okuma puanına göre her kategoriye ait en yüksek 5'er öğrencinin görüntülenmesi
top_n(5,ODOKUMA1)
## # A tibble: 10 × 2
## # Groups: CINSIYET [2]
## CINSIYET ODOKUMA1
## <dbl+lbl> <dbl>
## 1 1 [Kiz] 772.
## 2 1 [Kiz] 748.
## 3 2 [Erkek] 747.
## 4 1 [Kiz] 743.
## 5 2 [Erkek] 737.
## 6 1 [Kiz] 719.
## 7 1 [Kiz] 715.
## 8 2 [Erkek] 714.
## 9 2 [Erkek] 713.
## 10 2 [Erkek] 707.
Bu fonksiyon ‘-’ işaretiyle kullanıldığında veri setindeki en düşük değere sahip öğrencilerin özelliklerini gösteririr. Örneğin, okuma puanı en düşük 5 erkek ve 5 kız öğrencinin bilgileri aşağadaki gibidir.
midiPISA %>%
select(CINSIYET,ODOKUMA1)%>%
arrange(desc(ODOKUMA1))%>%
group_by(CINSIYET) %>%
# okuma puanına göre her kategoriye ait en düşük 5'er öğrencinin görüntülenmesi
top_n(-5,ODOKUMA1)
## # A tibble: 10 × 2
## # Groups: CINSIYET [2]
## CINSIYET ODOKUMA1
## <dbl+lbl> <dbl>
## 1 1 [Kiz] 254.
## 2 1 [Kiz] 253.
## 3 1 [Kiz] 250.
## 4 1 [Kiz] 242.
## 5 1 [Kiz] 236.
## 6 2 [Erkek] 220.
## 7 2 [Erkek] 211.
## 8 2 [Erkek] 199.
## 9 2 [Erkek] 177.
## 10 2 [Erkek] 176.
left_join()
, right_join()
,
full_join()
, inner_join()
,
semi_join()
, anti_join()
gibi farklı
kullanımları olan bu fonksiyon temelde iki veri setini istenilen şekilde
birleştirme amacıyla kullanılır.
left_join()
ile ilgili aşağıdaki uygulama
yapılmıştır.
midiPISA1 <- midiPISA %>% select(OGRENCIID,CINSIYET,ST097Q01TA,ST097Q02TA) #değişkenlerin seçimi
midiPISA1<-midiPISA1[1:6,] #veri setinin ilk 6 satırının seçilmesi
midiPISA1
## # A tibble: 6 × 4
## OGRENCIID CINSIYET ST097Q01TA ST097Q02TA
## <dbl> <dbl+lbl> <dbl+lbl> <dbl+lbl>
## 1 79200768 2 [Erkek] 1 [Her ders] 2 [Derslerin cogunda]
## 2 79201064 2 [Erkek] 3 [cogunlukla test dili] 2 [Derslerin cogunda]
## 3 79201118 1 [Kiz] 2 [Derslerin cogunda] 3 [cogunlukla test dili]
## 4 79201275 2 [Erkek] 2 [Derslerin cogunda] 2 [Derslerin cogunda]
## 5 79201481 2 [Erkek] 3 [cogunlukla test dili] 3 [cogunlukla test dili]
## 6 79201556 2 [Erkek] 3 [cogunlukla test dili] 3 [cogunlukla test dili]
#değişkenlerin seçimi
midiPISA2<- midiPISA %>% select(OGRENCIID,OKUMA_ZEVK,ODOKUMA1)
midiPISA2<-midiPISA2[1:7,] #veri setinin ilk 7 satırının seçilmesi
midiPISA2<-midiPISA2[-3,] #veri setinin 3. satırının çıkarılması
midiPISA2
## # A tibble: 6 × 3
## OGRENCIID OKUMA_ZEVK ODOKUMA1
## <dbl> <dbl> <dbl>
## 1 79200768 -0.289 376.
## 2 79201064 0.604 512.
## 3 79201275 -1.15 393.
## 4 79201481 0.667 552.
## 5 79201556 0.357 441.
## 6 79201652 -0.0886 411.
right_join()
ile ilgili aşağıdaki uygulama
yapılmıştır.
midiPISA1%>% right_join(midiPISA2) # veri birleştirme
## Joining with `by = join_by(OGRENCIID)`
## # A tibble: 6 × 6
## OGRENCIID CINSIYET ST097Q01TA ST097Q02TA OKUMA_ZEVK ODOKUMA1
## <dbl> <dbl+lbl> <dbl+lbl> <dbl+lbl> <dbl> <dbl>
## 1 79200768 2 [Erkek] 1 [Her ders] 2 [Dersle… -0.289 376.
## 2 79201064 2 [Erkek] 3 [cogunlukla test dili] 2 [Dersle… 0.604 512.
## 3 79201275 2 [Erkek] 2 [Derslerin cogunda] 2 [Dersle… -1.15 393.
## 4 79201481 2 [Erkek] 3 [cogunlukla test dili] 3 [cogunl… 0.667 552.
## 5 79201556 2 [Erkek] 3 [cogunlukla test dili] 3 [cogunl… 0.357 441.
## 6 79201652 NA NA NA -0.0886 411.
Fonksiyonun kullanımı içn aşağıda bir örnek yapabiliriz.
genisveri<- midiPISA %>% select(OGRENCIID,ODOKUMA1:ODOKUMA5) #belli değişkenlerin seçilmesi
genisveri %>% head(6) # verinin ilk 6 satırının görüntülenmesi
## # A tibble: 6 × 6
## OGRENCIID ODOKUMA1 ODOKUMA2 ODOKUMA3 ODOKUMA4 ODOKUMA5
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 79200768 376. 418. 421. 414. 434.
## 2 79201064 512. 473. 564. 485. 500.
## 3 79201118 396. 414. 423. 452. 392.
## 4 79201275 393. 429. 365. 383. 379.
## 5 79201481 552. 570. 563. 531. 532.
## 6 79201556 441. 416. 407. 437. 473.
gather()
fonksiyonuyla geniş veriyi uzun veri haline
getirebiliriz.
uzun <- genisveri %>% gather(O_OD,okumapuan,ODOKUMA1:ODOKUMA5)
## Warning: attributes are not identical across measure variables; they will be
## dropped
uzun %>% arrange(OGRENCIID) %>% head(10)
## # A tibble: 10 × 3
## OGRENCIID O_OD okumapuan
## <dbl> <chr> <dbl>
## 1 79200001 ODOKUMA1 450.
## 2 79200001 ODOKUMA2 458.
## 3 79200001 ODOKUMA3 413.
## 4 79200001 ODOKUMA4 430.
## 5 79200001 ODOKUMA5 439.
## 6 79200002 ODOKUMA1 669.
## 7 79200002 ODOKUMA2 666.
## 8 79200002 ODOKUMA3 685.
## 9 79200002 ODOKUMA4 665.
## 10 79200002 ODOKUMA5 660.
gather()
fonksiyonunun işlevinin tam tersini yapar. Uzun
olan veriyi yeniden geniş hale getirir.
tekrar_genis <- uzun %>% spread(O_OD,okumapuan) # geniş veri oluşturulması
tekrar_genis %>% head(6) # ilk altı satırın görüntülenmesi
## # A tibble: 6 × 6
## OGRENCIID ODOKUMA1 ODOKUMA2 ODOKUMA3 ODOKUMA4 ODOKUMA5
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 79200001 450. 458. 413. 430. 439.
## 2 79200002 669. 666. 685. 665. 660.
## 3 79200003 452. 502. 444. 456. 437.
## 4 79200004 347. 317. 339. 325. 367.
## 5 79200005 467. 498. 415. 471. 446.
## 6 79200006 366. 364. 384. 420. 351.
midiPISA verisetinden daha az değişken içerecek şekilde bir geniş veri seti örneği oluşturabiliriz.
genisveri <- midiPISA %>% select(OGRENCIID,ODOKUMA1:ODOKUMA5) #belli değişkenlerin seçilmesi
genisveri %>% head(6) # verinin ilk 6 satırının görüntülenmesi
## # A tibble: 6 × 6
## OGRENCIID ODOKUMA1 ODOKUMA2 ODOKUMA3 ODOKUMA4 ODOKUMA5
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 79200768 376. 418. 421. 414. 434.
## 2 79201064 512. 473. 564. 485. 500.
## 3 79201118 396. 414. 423. 452. 392.
## 4 79201275 393. 429. 365. 383. 379.
## 5 79201481 552. 570. 563. 531. 532.
## 6 79201556 441. 416. 407. 437. 473.
pivot_longer
fonksiyonu geniş veriyi, uzun veri haline
getirebilir.
uzun <- genisveri %>% pivot_longer(names_to="okumapuan",values_to="deger",cols=ODOKUMA1:ODOKUMA5)
uzun %>% head(5)
## # A tibble: 5 × 3
## OGRENCIID okumapuan deger
## <dbl> <chr> <dbl>
## 1 79200768 ODOKUMA1 376.
## 2 79200768 ODOKUMA2 418.
## 3 79200768 ODOKUMA3 421.
## 4 79200768 ODOKUMA4 414.
## 5 79200768 ODOKUMA5 434.
Bir veri setini daha iyi yorumlamak için geniş halde olmasısını
tercih ederiz. Bunu da pivot_wider
fonksiyonuyla
yapabiliriz.
genis<- uzun %>% pivot_wider(names_from="okumapuan",values_from="deger")
genis %>% head(5)
## # A tibble: 5 × 6
## OGRENCIID ODOKUMA1 ODOKUMA2 ODOKUMA3 ODOKUMA4 ODOKUMA5
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 79200768 376. 418. 421. 414. 434.
## 2 79201064 512. 473. 564. 485. 500.
## 3 79201118 396. 414. 423. 452. 392.
## 4 79201275 393. 429. 365. 383. 379.
## 5 79201481 552. 570. 563. 531. 532.
Bu fonksiyonu bir sütunu birden fazla sütuna bölmek için kullnabiliriz.
uzun_v1 <- uzun %>% separate(okumapuan, c("OD","Sayi"),"MA") # bir sütunu iki sütuna ayırma
uzun_v1 %>% head(3) #ilk üç satırın görüntülenmesi
## # A tibble: 3 × 4
## OGRENCIID OD Sayi deger
## <dbl> <chr> <chr> <dbl>
## 1 79200768 ODOKU 1 376.
## 2 79200768 ODOKU 2 418.
## 3 79200768 ODOKU 3 421.
seperate
fonksiyonun işlevinin tersini yapar.
uzun_birles <- uzun_v1 %>% unite(ODOKUMA, OD, Sayi, sep = "_") # sütun birleştirmenin yapılması
uzun_birles %>% head(3) # ilk üç satırın görüntülenmesi
## # A tibble: 3 × 3
## OGRENCIID ODOKUMA deger
## <dbl> <chr> <dbl>
## 1 79200768 ODOKU_1 376.
## 2 79200768 ODOKU_2 418.
## 3 79200768 ODOKU_3 421.