20  Hesap çizelgeleri

20.1 Giriş

Bölüm 7 bölümünde .csv ve .tsv gibi düz metin dosyalarından veri içe aktarmayı öğrendiniz. Şimdi Excel veya Google E-Tablolar hesap çizelgelerinden veri almayı öğrenme zamanı. Bölüm 7 bölümünde öğrendiklerinizden yararlanacak, ayrıca hesap çizelgelerindeki verilerle çalışmanın getirdiği ek konuları ve karmaşıklıkları ele alacağız.

Siz veya çalışma arkadaşlarınız verileri düzenlemek için hesap çizelgeleri kullanıyorsanız Karl Broman ve Kara Woo’nun “Data Organization in Spreadsheets” makalesini okumanızı özellikle öneririz: https://doi.org/10.1080/00031305.2017.1375989. Bu makaledeki en iyi uygulamalar, analiz etmek ve görselleştirmek üzere hesap çizelgelerinden R’a veri içe aktarırken sizi birçok sıkıntıdan kurtaracaktır.

20.2 Excel

Microsoft Excel, verilerin hesap çizelgesi dosyalarındaki çalışma sayfalarında düzenlendiği, yaygın kullanılan bir hesap çizelgesi yazılımıdır.

20.2.1 Ön koşullar

Bu bölümde readxl paketiyle Excel hesap çizelgelerinden R’a veri yüklemeyi öğreneceksiniz. Bu paket temel tidyverse’in parçası değildir; bu nedenle açıkça yüklemeniz gerekir. Ancak tidyverse paketini kurduğunuzda otomatik olarak kurulur. Daha sonra Excel hesap çizelgeleri oluşturmamızı sağlayan writexl paketini de kullanacağız.

20.2.2 Başlarken

readxl fonksiyonlarının çoğu Excel hesap çizelgelerini R’a yüklemenizi sağlar:

  • read_xls(), xls biçimindeki Excel dosyalarını okur.
  • read_xlsx(), xlsx biçimindeki Excel dosyalarını okur.
  • read_excel(), hem xls hem de xlsx biçimindeki dosyaları okuyabilir; dosya türünü girdiye bakarak tahmin eder.

Bu fonksiyonların sözdizimi, daha önce başka dosya türlerini okumak için tanıttığımız read_csv(), read_table() vb. fonksiyonlara benzer. Bölümün geri kalanında read_excel() kullanımına odaklanacağız.

20.2.3 Excel hesap çizelgelerini okuma

Şekil 20.1, R’a okuyacağımız hesap çizelgesinin Excel’deki görünümünü gösterir. Bu hesap çizelgesini https://docs.google.com/spreadsheets/d/1V1nPp1tzOuutXFLb3G9Eyxi3qxeEhnOXUzL5_BcCQ0w/ adresinden Excel dosyası olarak indirebilirsiniz.

students hesap çizelgesinin Excel'deki görünümü. Çizelge altı öğrencinin kimliğini, tam adını, sevdiği yemeği, yemek planını ve yaşını içeriyor.
Şekil 20.1: Excel’de students.xlsx adlı hesap çizelgesi.

read_excel() fonksiyonunun ilk argümanı okunacak dosyanın yoludur.

students <- read_excel("data/students.xlsx")

read_excel() dosyayı tibble olarak okur.

students
#> # A tibble: 6 × 5
#>   `Student ID` `Full Name`      favourite.food     mealPlan            AGE  
#>          <dbl> <chr>            <chr>              <chr>               <chr>
#> 1            1 Sunil Huffmann   Strawberry yoghurt Lunch only          4    
#> 2            2 Barclay Lynn     French fries       Lunch only          5    
#> 3            3 Jayendra Lyne    N/A                Breakfast and lunch 7    
#> 4            4 Leon Rossini     Anchovies          Lunch only          <NA> 
#> 5            5 Chidiegwu Dunkel Pizza              Breakfast and lunch five 
#> 6            6 Güvenç Attila    Ice cream          Lunch only          6

Verilerde altı öğrenci ve her öğrenci için beş değişken vardır. Ancak bu veri kümesinde ele almak isteyebileceğimiz birkaç sorun bulunuyor:

  1. Sütun adları tutarsızdır. col_names argümanıyla tutarlı bir biçim izleyen sütun adları verebilirsiniz; snake_case yazımını öneririz.

    read_excel(
      "data/students.xlsx",
      col_names = c("student_id", "full_name", "favourite_food", "meal_plan", "age")
    )
    #> # A tibble: 7 × 5
    #>   student_id full_name        favourite_food     meal_plan           age  
    #>   <chr>      <chr>            <chr>              <chr>               <chr>
    #> 1 Student ID Full Name        favourite.food     mealPlan            AGE  
    #> 2 1          Sunil Huffmann   Strawberry yoghurt Lunch only          4    
    #> 3 2          Barclay Lynn     French fries       Lunch only          5    
    #> 4 3          Jayendra Lyne    N/A                Breakfast and lunch 7    
    #> 5 4          Leon Rossini     Anchovies          Lunch only          <NA> 
    #> 6 5          Chidiegwu Dunkel Pizza              Breakfast and lunch five 
    #> 7 6          Güvenç Attila    Ice cream          Lunch only          6

    Ne yazık ki bu işlem tek başına yeterli olmadı. Artık istediğimiz değişken adlarına sahibiz; ancak önceki başlık satırı verilerin ilk gözlemi olarak görünüyor. Bu satırı skip argümanıyla açıkça atlayabilirsiniz.

    read_excel(
      "data/students.xlsx",
      col_names = c("student_id", "full_name", "favourite_food", "meal_plan", "age"),
      skip = 1
    )
    #> # A tibble: 6 × 5
    #>   student_id full_name        favourite_food     meal_plan           age  
    #>        <dbl> <chr>            <chr>              <chr>               <chr>
    #> 1          1 Sunil Huffmann   Strawberry yoghurt Lunch only          4    
    #> 2          2 Barclay Lynn     French fries       Lunch only          5    
    #> 3          3 Jayendra Lyne    N/A                Breakfast and lunch 7    
    #> 4          4 Leon Rossini     Anchovies          Lunch only          <NA> 
    #> 5          5 Chidiegwu Dunkel Pizza              Breakfast and lunch five 
    #> 6          6 Güvenç Attila    Ice cream          Lunch only          6
  2. favourite_food sütunundaki gözlemlerden biri “mevcut değil” anlamına gelen N/A değeridir; ancak şu anda NA olarak tanınmamaktadır. Bu N/A ile listedeki dördüncü öğrencinin yaşındaki eksik değer arasındaki farka dikkat edin. Hangi karakter dizilerinin NA olarak tanınacağını na argümanıyla belirtebilirsiniz. Varsayılan olarak yalnızca "", yani boş karakter dizisi; hesap çizelgelerinde boş hücre veya =NA() formülünü içeren hücre NA olarak tanınır.

    read_excel(
      "data/students.xlsx",
      col_names = c("student_id", "full_name", "favourite_food", "meal_plan", "age"),
      skip = 1,
      na = c("", "N/A")
    )
    #> # A tibble: 6 × 5
    #>   student_id full_name        favourite_food     meal_plan           age  
    #>        <dbl> <chr>            <chr>              <chr>               <chr>
    #> 1          1 Sunil Huffmann   Strawberry yoghurt Lunch only          4    
    #> 2          2 Barclay Lynn     French fries       Lunch only          5    
    #> 3          3 Jayendra Lyne    <NA>               Breakfast and lunch 7    
    #> 4          4 Leon Rossini     Anchovies          Lunch only          <NA> 
    #> 5          5 Chidiegwu Dunkel Pizza              Breakfast and lunch five 
    #> 6          6 Güvenç Attila    Ice cream          Lunch only          6
  3. Kalan sorunlardan biri, age değişkeninin karakter türünde okunmasıdır; oysa sayısal olmalıdır. Düz dosyaları okumaya yarayan read_csv() ve benzeri fonksiyonlarda olduğu gibi read_excel() fonksiyonuna col_types argümanı vererek okunan değişkenlerin sütun türlerini belirtebilirsiniz. Ancak sözdizimi biraz farklıdır. Seçenekleriniz "skip", "guess", "logical", "numeric", "date", "text" ve "list" değerleridir.

    read_excel(
      "data/students.xlsx",
      col_names = c("student_id", "full_name", "favourite_food", "meal_plan", "age"),
      skip = 1,
      na = c("", "N/A"),
      col_types = c("numeric", "text", "text", "text", "numeric")
    )
    #> Warning: Expecting numeric in E6 / R6C5: got 'five'
    #> # A tibble: 6 × 5
    #>   student_id full_name        favourite_food     meal_plan             age
    #>        <dbl> <chr>            <chr>              <chr>               <dbl>
    #> 1          1 Sunil Huffmann   Strawberry yoghurt Lunch only              4
    #> 2          2 Barclay Lynn     French fries       Lunch only              5
    #> 3          3 Jayendra Lyne    <NA>               Breakfast and lunch     7
    #> 4          4 Leon Rossini     Anchovies          Lunch only             NA
    #> 5          5 Chidiegwu Dunkel Pizza              Breakfast and lunch    NA
    #> 6          6 Güvenç Attila    Ice cream          Lunch only              6

    Ancak bu da istediğimiz sonucu tam olarak vermedi. age değişkeninin sayısal olması gerektiğini belirttiğimiz için sayısal olmayan five değerini içeren hücre NA değerine dönüştü. Bu durumda yaşı "text" olarak okumalı, veriler R’a yüklendikten sonra dönüştürmeliyiz.

    students <- read_excel(
      "data/students.xlsx",
      col_names = c("student_id", "full_name", "favourite_food", "meal_plan", "age"),
      skip = 1,
      na = c("", "N/A"),
      col_types = c("numeric", "text", "text", "text", "text")
    )
    
    students <- students |>
      mutate(
        age = if_else(age == "five", "5", age),
        age = parse_number(age)
      )
    
    students
    #> # A tibble: 6 × 5
    #>   student_id full_name        favourite_food     meal_plan             age
    #>        <dbl> <chr>            <chr>              <chr>               <dbl>
    #> 1          1 Sunil Huffmann   Strawberry yoghurt Lunch only              4
    #> 2          2 Barclay Lynn     French fries       Lunch only              5
    #> 3          3 Jayendra Lyne    <NA>               Breakfast and lunch     7
    #> 4          4 Leon Rossini     Anchovies          Lunch only             NA
    #> 5          5 Chidiegwu Dunkel Pizza              Breakfast and lunch     5
    #> 6          6 Güvenç Attila    Ice cream          Lunch only              6

Verileri tam istediğimiz biçimde yüklemek birkaç adım ve deneme yanılma gerektirdi; bu beklenmedik bir durum değildir. Veri bilimi yinelemeli bir süreçtir. İnsanlar hesap çizelgelerine veri girip bunları yalnızca depolama için değil, paylaşım ve iletişim için de kullandığından hesap çizelgelerini okumak, dikdörtgen biçimli düz metin dosyalarını okumaktan daha zahmetli olabilir.

Verileri yükleyip incelemeden tam olarak nasıl görüneceklerini bilmenin bir yolu yoktur. Aslında bir yol vardır: dosyayı Excel’de açıp göz atabilirsiniz. Bunu yapacaksanız özgün veri dosyasına dokunmadan Excel dosyasının bir kopyasını oluşturup etkileşimli inceleme için bu kopyayı açmanızı, R’a ise özgün dosyayı okumanızı öneririz. Böylece incelerken hesap çizelgesindeki herhangi bir şeyin yanlışlıkla üzerine yazmazsınız. Burada yaptığımız işlemi uygulamaktan da çekinmeyin: verileri yükleyin, inceleyin, kodu ayarlayın, yeniden yükleyin ve sonuçtan memnun kalana kadar yineleyin.

20.2.4 Çalışma sayfalarını okuma

Hesap çizelgelerini düz dosyalardan ayıran önemli bir özellik, çalışma sayfası adı verilen birden fazla sayfa içerebilmeleridir. Şekil 20.2, birden fazla çalışma sayfasına sahip Excel hesap çizelgesini gösterir. Veriler palmerpenguins paketinden gelir ve hesap çizelgesini https://docs.google.com/spreadsheets/d/1aFu8lnD_g0yjF5O-K6SFgSEWiHPpgvFCF0NY9D6LXnY/ adresinden Excel dosyası olarak indirebilirsiniz. Her çalışma sayfası, verilerin toplandığı farklı bir adadaki penguenlere ilişkin bilgiler içerir.

penguins hesap çizelgesinin Excel'deki görünümü. Çizelge Torgersen Island, Biscoe Island ve Dream Island adlı üç çalışma sayfası içeriyor.
Şekil 20.2: Excel’de üç çalışma sayfası içeren penguins.xlsx adlı hesap çizelgesi.

read_excel() fonksiyonunun sheet argümanıyla hesap çizelgesindeki tek bir çalışma sayfasını okuyabilirsiniz. Şimdiye kadar kullandığımız varsayılan değer ilk sayfadır.

read_excel("data/penguins.xlsx", sheet = "Torgersen Island")
#> # A tibble: 52 × 8
#>   species island    bill_length_mm     bill_depth_mm      flipper_length_mm
#>   <chr>   <chr>     <chr>              <chr>              <chr>            
#> 1 Adelie  Torgersen 39.1               18.7               181              
#> 2 Adelie  Torgersen 39.5               17.399999999999999 186              
#> 3 Adelie  Torgersen 40.299999999999997 18                 195              
#> 4 Adelie  Torgersen NA                 NA                 NA               
#> 5 Adelie  Torgersen 36.700000000000003 19.3               193              
#> 6 Adelie  Torgersen 39.299999999999997 20.6               190              
#> # ℹ 46 more rows
#> # ℹ 3 more variables: body_mass_g <chr>, sex <chr>, year <dbl>

"NA" karakter dizisi gerçek bir NA olarak tanınmadığı için sayısal veri içeriyor gibi görünen bazı değişkenler karakter türünde okunur.

penguins_torgersen <- read_excel("data/penguins.xlsx", sheet = "Torgersen Island", na = "NA")

penguins_torgersen
#> # A tibble: 52 × 8
#>   species island    bill_length_mm bill_depth_mm flipper_length_mm
#>   <chr>   <chr>              <dbl>         <dbl>             <dbl>
#> 1 Adelie  Torgersen           39.1          18.7               181
#> 2 Adelie  Torgersen           39.5          17.4               186
#> 3 Adelie  Torgersen           40.3          18                 195
#> 4 Adelie  Torgersen           NA            NA                  NA
#> 5 Adelie  Torgersen           36.7          19.3               193
#> 6 Adelie  Torgersen           39.3          20.6               190
#> # ℹ 46 more rows
#> # ℹ 3 more variables: body_mass_g <dbl>, sex <chr>, year <dbl>

Alternatif olarak Excel hesap çizelgesindeki tüm çalışma sayfalarına ilişkin bilgi almak için excel_sheets() kullanabilir, ardından ilgilendiğiniz sayfaları okuyabilirsiniz.

excel_sheets("data/penguins.xlsx")
#> [1] "Torgersen Island" "Biscoe Island"    "Dream Island"

Çalışma sayfalarının adlarını öğrendikten sonra her birini read_excel() ile ayrı ayrı okuyabilirsiniz.

penguins_biscoe <- read_excel("data/penguins.xlsx", sheet = "Biscoe Island", na = "NA")
penguins_dream  <- read_excel("data/penguins.xlsx", sheet = "Dream Island", na = "NA")

Bu örnekte penguins veri kümesinin tamamı hesap çizelgesindeki üç çalışma sayfasına yayılmıştır. Her çalışma sayfası aynı sayıda sütuna, ancak farklı sayıda satıra sahiptir.

dim(penguins_torgersen)
#> [1] 52  8
dim(penguins_biscoe)
#> [1] 168   8
dim(penguins_dream)
#> [1] 124   8

Bunları bind_rows() ile bir araya getirebiliriz.

penguins <- bind_rows(penguins_torgersen, penguins_biscoe, penguins_dream)
penguins
#> # A tibble: 344 × 8
#>   species island    bill_length_mm bill_depth_mm flipper_length_mm
#>   <chr>   <chr>              <dbl>         <dbl>             <dbl>
#> 1 Adelie  Torgersen           39.1          18.7               181
#> 2 Adelie  Torgersen           39.5          17.4               186
#> 3 Adelie  Torgersen           40.3          18                 195
#> 4 Adelie  Torgersen           NA            NA                  NA
#> 5 Adelie  Torgersen           36.7          19.3               193
#> 6 Adelie  Torgersen           39.3          20.6               190
#> # ℹ 338 more rows
#> # ℹ 3 more variables: body_mass_g <dbl>, sex <chr>, year <dbl>

Bölüm 26 bölümünde bu tür görevleri yinelenen kod yazmadan yapmanın yollarını ele alacağız.

20.2.5 Sayfanın bir bölümünü okuma

Excel hesap çizelgeleri veri depolamanın yanı sıra sunum amacıyla da kullanıldığından, R’a okumak istediğiniz verilerin parçası olmayan hücrelerle karşılaşmak oldukça yaygındır. Şekil 20.3 böyle bir hesap çizelgesini gösterir: sayfanın ortasında veri çerçevesine benzeyen bir alan, bunun üstünde ve altında ise gereksiz metinler vardır.

deaths hesap çizelgesinin Excel'deki görünümü. Üstte veri dışı bilgiler içeren dört satır vardır. Ardından on ünlü kişinin adı, mesleği, yaşı, çocuk sahibi olup olmadığı, doğum ve ölüm tarihlerini içeren bir veri çerçevesi gelir. Altta da veri dışı bilgiler içeren dört satır bulunur.
Şekil 20.3: Excel’de deaths.xlsx adlı hesap çizelgesi.

Bu hesap çizelgesi readxl paketindeki örneklerden biridir. Paketin kurulu olduğu dizindeki dosyayı bulmak için readxl_example() fonksiyonunu kullanabilirsiniz. Fonksiyon, her zamanki gibi read_excel() içinde kullanabileceğiniz dosya yolunu döndürür.

deaths_path <- readxl_example("deaths.xlsx")
deaths <- read_excel(deaths_path)
#> New names:
#> • `` -> `...2`
#> • `` -> `...3`
#> • `` -> `...4`
#> • `` -> `...5`
#> • `` -> `...6`
deaths
#> # A tibble: 18 × 6
#>   `Lots of people`    ...2       ...3  ...4     ...5          ...6           
#>   <chr>               <chr>      <chr> <chr>    <chr>         <chr>          
#> 1 simply cannot resi… <NA>       <NA>  <NA>     <NA>          some notes     
#> 2 at                  the        top   <NA>     of            their spreadsh…
#> 3 or                  merging    <NA>  <NA>     <NA>          cells          
#> 4 Name                Profession Age   Has kids Date of birth Date of death  
#> 5 David Bowie         musician   69    TRUE     17175         42379          
#> 6 Carrie Fisher       actor      60    TRUE     20749         42731          
#> # ℹ 12 more rows

Üstteki üç ve alttaki dört satır veri çerçevesinin parçası değildir. Bu gereksiz satırları skip ve n_max argümanlarıyla kaldırmak mümkündür; ancak hücre aralıklarını kullanmanızı öneririz. Excel’de sol üst hücre A1’dir. Sütunlarda sağa ilerledikçe hücre etiketindeki harf alfabede ilerler: B1, C1 vb. Bir sütunda aşağı indikçe hücre etiketindeki sayı artar: A2, A3 vb.

Burada okumak istediğimiz veriler A5 hücresinde başlayıp F15 hücresinde biter. Hesap çizelgesi gösteriminde bu aralık A5:F15 olarak yazılır ve range argümanına verilir:

read_excel(deaths_path, range = "A5:F15")
#> # A tibble: 10 × 6
#>   Name          Profession   Age `Has kids` `Date of birth`    
#>   <chr>         <chr>      <dbl> <lgl>      <dttm>             
#> 1 David Bowie   musician      69 TRUE       1947-01-08 00:00:00
#> 2 Carrie Fisher actor         60 TRUE       1956-10-21 00:00:00
#> 3 Chuck Berry   musician      90 TRUE       1926-10-18 00:00:00
#> 4 Bill Paxton   actor         61 TRUE       1955-05-17 00:00:00
#> 5 Prince        musician      57 TRUE       1958-06-07 00:00:00
#> 6 Alan Rickman  actor         69 FALSE      1946-02-21 00:00:00
#> # ℹ 4 more rows
#> # ℹ 1 more variable: `Date of death` <dttm>

20.2.6 Veri türleri

CSV dosyalarında tüm değerler karakter dizisidir. Bu, verileri tam olarak yansıtmasa da basittir: her şey karakter dizisidir.

Excel hesap çizelgelerinin temelindeki veriler daha karmaşıktır. Bir hücre dört türden birinde olabilir:

  • TRUE, FALSE veya NA gibi bir mantıksal değer.

  • “10” veya “10.5” gibi bir sayı.

  • “11/1/21” veya “11/1/21 3:00 PM” gibi saat de içerebilen bir tarih-saat.

  • “ten” gibi bir metin karakter dizisi.

Hesap çizelgesi verileriyle çalışırken temel verinin hücrede gördüğünüzden çok farklı olabileceğini unutmayın. Örneğin Excel’de tam sayı kavramı yoktur. Tüm sayılar kayan noktalı olarak saklanır; ancak verileri istediğiniz sayıda ondalık basamakla gösterebilirsiniz. Benzer biçimde tarihler de aslında sayı, daha açık söylersek 1 Ocak 1900’den bu yana geçen gün sayısı olarak saklanır. Excel’de biçimlendirme uygulayarak tarihin görünümünü özelleştirebilirsiniz. Kafa karıştırıcı biçimde, sayı gibi görünen ancak gerçekte karakter dizisi olan bir değer de oluşturabilirsiniz; örneğin Excel hücresine '10 yazabilirsiniz.

Temel verilerin saklanma ve gösterilme biçimleri arasındaki farklar, veriler R’a yüklendiğinde şaşırtıcı sonuçlara yol açabilir. readxl varsayılan olarak belirli bir sütundaki veri türünü tahmin eder. Önerilen iş akışı, sütun türlerini readxl’ın tahmin etmesine izin vermek, tahminleri denetlemek ve uygun değillerse Bölüm 20.2.3 bölümünde gösterildiği gibi col_types belirterek verileri yeniden içe aktarmaktır.

Excel hesap çizelgenizde bu türleri karışık biçimde içeren, örneğin bazı hücreleri sayısal, bazıları metin, bazıları tarih olan bir sütun bulunması başka bir güçlüktür. Veriler R’a içe aktarılırken readxl bazı kararlar vermek zorundadır. Bu durumlarda sütun türünü "list" olarak ayarlayabilirsiniz. Böylece sütun, her elemanının türü ayrı ayrı tahmin edilen, uzunluğu 1 olan vektörlerden oluşan bir liste olarak yüklenir.

Bazen veriler hücrenin arka plan rengi veya metnin kalın olup olmaması gibi daha alışılmadık biçimlerde saklanır. Bu durumlarda tidyxl paketini yararlı bulabilirsiniz. Excel’deki tablo biçiminde olmayan verilerle çalışma stratejileri için https://nacnudus.github.io/spreadsheet-munging-strategies/ adresine bakın.

20.2.7 Excel’e yazma

Daha sonra dosyaya yazabileceğimiz küçük bir veri çerçevesi oluşturalım. item değişkeninin faktör, quantity değişkeninin tam sayı olduğuna dikkat edin.

bake_sale <- tibble(
  item     = factor(c("brownie", "cupcake", "cookie")),
  quantity = c(10, 5, 8)
)

bake_sale
#> # A tibble: 3 × 2
#>   item    quantity
#>   <fct>      <dbl>
#> 1 brownie       10
#> 2 cupcake        5
#> 3 cookie         8

Verileri writexl paketindeki write_xlsx() fonksiyonuyla Excel dosyası olarak diske yazabilirsiniz:

write_xlsx(bake_sale, path = "data/bake-sale.xlsx")

Şekil 20.4 verilerin Excel’deki görünümünü gösterir. Sütun adlarının eklendiğine ve kalın yazıldığına dikkat edin. col_names ve format_headers argümanlarını FALSE yaparak bunları kapatabilirsiniz.

Daha önce oluşturulan bake_sale veri çerçevesinin Excel'deki görünümü.
Şekil 20.4: Excel’de bake-sale.xlsx adlı hesap çizelgesi.

CSV okurken olduğu gibi verileri yeniden okuduğumuzda veri türü bilgisi kaybolur. Bu nedenle Excel dosyaları ara sonuçları önbelleğe almak için de güvenilir değildir. Alternatifler için Bölüm 7.5 bölümüne bakın.

read_excel("data/bake-sale.xlsx")
#> # A tibble: 3 × 2
#>   item    quantity
#>   <chr>      <dbl>
#> 1 brownie       10
#> 2 cupcake        5
#> 3 cookie         8

20.2.8 Biçimlendirilmiş çıktı

writexl basit bir Excel hesap çizelgesi yazmak için hafif bir çözümdür. Çalışma sayfalarına yazma ve stil uygulama gibi ek özelliklerle ilgileniyorsanız openxlsx paketini kullanmak isteyeceksiniz. Bu paketin ayrıntılarına burada girmeyeceğiz; ancak openxlsx ile R’dan Excel’e yazılan verilerin gelişmiş biçimlendirme olanakları için https://ycphs.github.io/openxlsx/articles/Formatting.html adresini okumanızı öneririz.

Bu paket tidyverse’in parçası olmadığından fonksiyonları ve iş akışları size yabancı gelebilir. Örneğin fonksiyon adları camelCase biçimindedir, birden fazla fonksiyon işlem hatlarında birleştirilemez ve argümanlar tidyverse’te alıştığınızdan farklı sıradadır. Ancak bu sorun değildir. R bilginiz ve kullanımınız bu kitabın ötesine geçtikçe belirli amaçlara yönelik farklı R paketlerinde birçok kod stiliyle karşılaşacaksınız. Yeni bir paketin kod stiline alışmanın iyi bir yolu, varsa paket vinyetlerini okumak ve fonksiyon belgelerindeki örnekleri çalıştırarak sözdizimiyle çıktı biçimlerini görmektir.

20.2.9 Alıştırmalar

  1. Aşağıdaki veri kümesini bir Excel dosyasında oluşturup survey.xlsx olarak kaydedin. Alternatif olarak Excel dosyasını buradan indirebilirsiniz.

    3 sütunlu (group, subgroup ve id) ve 12 satırlı bir hesap çizelgesi. group sütununun iki değeri vardır: 1 (birleştirilmiş 7 satıra yayılır) ve 2 (birleştirilmiş 5 satıra yayılır). subgroup sütununun dört değeri vardır: A (birleştirilmiş 3 satıra yayılır), B (birleştirilmiş 4 satıra yayılır), A (birleştirilmiş 2 satıra yayılır) ve B (birleştirilmiş 3 satıra yayılır). id sütununda 1'den 12'ye kadar on iki sayı bulunur.

    Ardından survey_id karakter, n_pets sayısal değişken olacak biçimde dosyayı R’a okuyun.

    #> # A tibble: 6 × 2
    #>   survey_id n_pets
    #>   <chr>      <dbl>
    #> 1 1              0
    #> 2 2              1
    #> 3 3             NA
    #> 4 4              2
    #> 5 5              2
    #> 6 6             NA
  2. Aşağıdaki veri kümesini başka bir Excel dosyasında oluşturup roster.xlsx olarak kaydedin. Alternatif olarak Excel dosyasını buradan indirebilirsiniz.

    3 sütunlu (group, subgroup ve id) ve 12 satırlı bir hesap çizelgesi. group sütununun iki değeri vardır: 1 (birleştirilmiş 7 satıra yayılır) ve 2 (birleştirilmiş 5 satıra yayılır). subgroup sütununun dört değeri vardır: A (birleştirilmiş 3 satıra yayılır), B (birleştirilmiş 4 satıra yayılır), A (birleştirilmiş 2 satıra yayılır) ve B (birleştirilmiş 3 satıra yayılır). id sütununda 1'den 12'ye kadar on iki sayı bulunur.

    Ardından dosyayı R’a okuyun. Ortaya çıkan veri çerçevesi roster adını taşımalı ve aşağıdaki gibi görünmelidir.

    #> # A tibble: 12 × 3
    #>    group subgroup    id
    #>    <dbl> <chr>    <dbl>
    #>  1     1 A            1
    #>  2     1 A            2
    #>  3     1 A            3
    #>  4     1 B            4
    #>  5     1 B            5
    #>  6     1 B            6
    #>  7     1 B            7
    #>  8     2 A            8
    #>  9     2 A            9
    #> 10     2 B           10
    #> 11     2 B           11
    #> 12     2 B           12
  3. Aşağıdaki veri kümesini yeni bir Excel dosyasında oluşturup sales.xlsx olarak kaydedin. Alternatif olarak Excel dosyasını buradan indirebilirsiniz.

    2 sütunlu ve 13 satırlı bir hesap çizelgesi. İlk iki satırda sayfa hakkında bilgi veren metinler bulunur. 1. satırda "Bu dosya satışlarla ilgili bilgiler içerir" yazar. 2. satırda "Veriler marka adına göre düzenlenmiştir; her marka için satılan ürünün kimlik numarası ve kaç adet satıldığı bulunur." yazar. Ardından iki boş satır ve 9 veri satırı gelir.

    a. sales.xlsx dosyasını okuyup sales olarak kaydedin. Veri çerçevesi, sütun adları id ve n ve dokuz satırla aşağıdaki gibi görünmelidir.

    #> # A tibble: 9 × 2
    #>   id      n    
    #>   <chr>   <chr>
    #> 1 Brand 1 n    
    #> 2 1234    8    
    #> 3 8721    2    
    #> 4 1822    3    
    #> 5 Brand 2 n    
    #> 6 3333    1    
    #> 7 2156    3    
    #> 8 3987    6    
    #> 9 3216    5

    b. sales veri çerçevesini üç sütunlu (brand, id, n) ve yedi satırlı aşağıdaki düzenli biçime getirin. id ve n değişkenlerinin sayısal, brand değişkeninin karakter türünde olduğuna dikkat edin.

    #> # A tibble: 7 × 3
    #>   brand      id     n
    #>   <chr>   <dbl> <dbl>
    #> 1 Brand 1  1234     8
    #> 2 Brand 1  8721     2
    #> 3 Brand 1  1822     3
    #> 4 Brand 2  3333     1
    #> 5 Brand 2  2156     3
    #> 6 Brand 2  3987     6
    #> 7 Brand 2  3216     5
  4. bake_sale veri çerçevesini yeniden oluşturup openxlsx paketindeki write.xlsx() fonksiyonuyla Excel dosyasına yazın.

  5. Bölüm 7 bölümünde sütun adlarını snake_case biçimine dönüştüren janitor::clean_names() fonksiyonunu öğrendiniz. Bu bölümde daha önce tanıttığımız students.xlsx dosyasını okuyup sütun adlarını “temizlemek” için bu fonksiyonu kullanın.

  6. .xlsx uzantılı bir dosyayı read_xls() ile okumaya çalışırsanız ne olur?

20.3 Google E-Tablolar

Google E-Tablolar da yaygın kullanılan bir hesap çizelgesi uygulamasıdır. Ücretsizdir ve web üzerinde çalışır. Excel’de olduğu gibi Google E-Tablolar’da da veriler hesap çizelgesi dosyalarının içindeki çalışma sayfalarında düzenlenir.

20.3.1 Ön koşullar

Bu bölüm de hesap çizelgelerine odaklanır; ancak bu kez googlesheets4 paketiyle Google E-Tablolar’dan veri yükleyeceksiniz. Bu paket de temel tidyverse’in parçası olmadığından açıkça yüklenmelidir.

Paketin adıyla ilgili kısa bir not: googlesheets4, Google E-Tablolar’a R arayüzü sağlamak için Sheets API v4 sürümünü kullanır; adı buradan gelir.

20.3.2 Başlarken

googlesheets4 paketinin temel fonksiyonu, Google E-Tablolar dosyasını URL veya dosya kimliğinden okuyan read_sheet() fonksiyonudur. Bu fonksiyon range_read() adıyla da kullanılabilir.

gs4_create() ile yeni bir hesap çizelgesi oluşturabilir veya sheet_write() ve benzeri fonksiyonlarla mevcut bir çizelgeye yazabilirsiniz.

Bu bölümde Excel ve Google E-Tablolar’dan veri okuma iş akışlarının benzerliklerini ve farklarını göstermek için Excel bölümündeki veri kümelerini kullanacağız. readxl ve googlesheets4 paketlerinin ikisi de Bölüm 7 bölümünde gördüğünüz read_csv() fonksiyonunu sunan readr paketinin davranışını taklit edecek biçimde tasarlanmıştır. Bu nedenle birçok görev yalnızca read_excel() yerine read_sheet() kullanılarak gerçekleştirilebilir. Ancak Excel ile Google E-Tablolar tam olarak aynı biçimde davranmadığından bazı görevlerde fonksiyon çağrılarını daha fazla değiştirmeniz gerekebilir.

20.3.3 Google E-Tablolar’ı okuma

Şekil 20.5, R’a okuyacağımız hesap çizelgesinin Google E-Tablolar’daki görünümünü gösterir. Bu, Şekil 20.1 ile aynı veri kümesidir; yalnızca Excel yerine Google E-Tablolar’da saklanır.

students hesap çizelgesinin Google E-Tablolar'daki görünümü. Çizelge altı öğrencinin kimliğini, tam adını, sevdiği yemeği, yemek planını ve yaşını içeriyor.
Şekil 20.5: Tarayıcı penceresinde students adlı Google E-Tablolar dosyası.

read_sheet() fonksiyonunun ilk argümanı okunacak dosyanın URL’sidir ve fonksiyon bir tibble döndürür:
https://docs.google.com/spreadsheets/d/1V1nPp1tzOuutXFLb3G9Eyxi3qxeEhnOXUzL5_BcCQ0w. Bu URL’lerle çalışmak kolay olmadığından çoğunlukla hesap çizelgesini kimliğiyle tanımlamak istersiniz.

students_sheet_id <- "1V1nPp1tzOuutXFLb3G9Eyxi3qxeEhnOXUzL5_BcCQ0w"
students <- read_sheet(students_sheet_id)
#> ✔ Reading from students.
#> ✔ Range Sheet1.
students
#> # A tibble: 6 × 5
#>   `Student ID` `Full Name`      favourite.food     mealPlan            AGE   
#>          <dbl> <chr>            <chr>              <chr>               <list>
#> 1            1 Sunil Huffmann   Strawberry yoghurt Lunch only          <dbl> 
#> 2            2 Barclay Lynn     French fries       Lunch only          <dbl> 
#> 3            3 Jayendra Lyne    N/A                Breakfast and lunch <dbl> 
#> 4            4 Leon Rossini     Anchovies          Lunch only          <NULL>
#> 5            5 Chidiegwu Dunkel Pizza              Breakfast and lunch <chr> 
#> 6            6 Güvenç Attila    Ice cream          Lunch only          <dbl>

read_excel() fonksiyonunda yaptığımız gibi read_sheet() fonksiyonuna sütun adları, NA karakter dizileri ve sütun türleri verebiliriz.

students <- read_sheet(
  students_sheet_id,
  col_names = c("student_id", "full_name", "favourite_food", "meal_plan", "age"),
  skip = 1,
  na = c("", "N/A"),
  col_types = "dcccc"
)
#> ✔ Reading from students.
#> ✔ Range 2:10000000.

students
#> # A tibble: 6 × 5
#>   student_id full_name        favourite_food     meal_plan           age  
#>        <dbl> <chr>            <chr>              <chr>               <chr>
#> 1          1 Sunil Huffmann   Strawberry yoghurt Lunch only          4    
#> 2          2 Barclay Lynn     French fries       Lunch only          5    
#> 3          3 Jayendra Lyne    <NA>               Breakfast and lunch 7    
#> 4          4 Leon Rossini     Anchovies          Lunch only          <NA> 
#> 5          5 Chidiegwu Dunkel Pizza              Breakfast and lunch five 
#> 6          6 Güvenç Attila    Ice cream          Lunch only          6

Burada sütun türlerini kısa kodlarla, biraz farklı biçimde tanımladığımıza dikkat edin. Örneğin “dcccc”, “double, character, character, character, character” türlerini belirtir.

Google E-Tablolar’daki çalışma sayfalarını ayrı ayrı okumak da mümkündür. penguins Google E-Tablolar dosyasındaki “Torgersen Island” sayfasını okuyalım:

penguins_sheet_id <- "1aFu8lnD_g0yjF5O-K6SFgSEWiHPpgvFCF0NY9D6LXnY"
read_sheet(penguins_sheet_id, sheet = "Torgersen Island")
#> ✔ Reading from penguins.
#> ✔ Range ''Torgersen Island''.
#> # A tibble: 52 × 8
#>   species island    bill_length_mm bill_depth_mm flipper_length_mm
#>   <chr>   <chr>     <list>         <list>        <list>           
#> 1 Adelie  Torgersen <dbl [1]>      <dbl [1]>     <dbl [1]>        
#> 2 Adelie  Torgersen <dbl [1]>      <dbl [1]>     <dbl [1]>        
#> 3 Adelie  Torgersen <dbl [1]>      <dbl [1]>     <dbl [1]>        
#> 4 Adelie  Torgersen <chr [1]>      <chr [1]>     <chr [1]>        
#> 5 Adelie  Torgersen <dbl [1]>      <dbl [1]>     <dbl [1]>        
#> 6 Adelie  Torgersen <dbl [1]>      <dbl [1]>     <dbl [1]>        
#> # ℹ 46 more rows
#> # ℹ 3 more variables: body_mass_g <list>, sex <chr>, year <dbl>

Bir Google E-Tablolar dosyasındaki tüm sayfaların listesini sheet_names() ile alabilirsiniz:

sheet_names(penguins_sheet_id)
#> [1] "Torgersen Island" "Biscoe Island"    "Dream Island"

Son olarak read_excel() fonksiyonunda olduğu gibi read_sheet() içinde range tanımlayarak Google E-Tablolar dosyasının bir bölümünü okuyabiliriz. Aşağıda googlesheets4 paketiyle gelen örnek bir çizelgeyi bulmak için gs4_example() fonksiyonunu da kullandığımıza dikkat edin.

deaths_url <- gs4_example("deaths")
deaths <- read_sheet(deaths_url, range = "A5:F15")
#> ✔ Reading from deaths.
#> ✔ Range A5:F15.
deaths
#> # A tibble: 10 × 6
#>   Name          Profession   Age `Has kids` `Date of birth`    
#>   <chr>         <chr>      <dbl> <lgl>      <dttm>             
#> 1 David Bowie   musician      69 TRUE       1947-01-08 00:00:00
#> 2 Carrie Fisher actor         60 TRUE       1956-10-21 00:00:00
#> 3 Chuck Berry   musician      90 TRUE       1926-10-18 00:00:00
#> 4 Bill Paxton   actor         61 TRUE       1955-05-17 00:00:00
#> 5 Prince        musician      57 TRUE       1958-06-07 00:00:00
#> 6 Alan Rickman  actor         69 FALSE      1946-02-21 00:00:00
#> # ℹ 4 more rows
#> # ℹ 1 more variable: `Date of death` <dttm>

20.3.4 Google E-Tablolar’a yazma

R’dan Google E-Tablolar’a write_sheet() ile yazabilirsiniz. İlk argüman yazılacak veri çerçevesi, ikinci argüman ise hedef Google E-Tablolar dosyasının adı veya başka bir tanımlayıcısıdır:

write_sheet(bake_sale, ss = "bake-sale")

Verilerinizi Google E-Tablolar dosyasındaki belirli bir çalışma sayfasına yazmak isterseniz bunu sheet argümanıyla belirtebilirsiniz.

write_sheet(bake_sale, ss = "bake-sale", sheet = "Sales")

20.3.5 Kimlik doğrulama

Herkese açık bir Google E-Tablolar dosyasını Google hesabınızla kimlik doğrulamadan ve gs4_deauth() kullanarak okuyabilirsiniz. Ancak özel bir çizelgeyi okumak veya bir çizelgeye yazmak için googlesheets4 paketinin sizin Google E-Tablolar dosyalarınızı görüntüleyip yönetebilmesi amacıyla kimlik doğrulaması gerekir.

Kimlik doğrulaması gerektiren bir çizelgeyi okumaya çalıştığınızda googlesheets4 sizi Google hesabınızda oturum açmanızı ve Google E-Tablolar’da sizin adınıza işlem yapma izni vermenizi isteyen bir web tarayıcısına yönlendirir. Belirli bir Google hesabını, yetkilendirme kapsamını vb. seçmek isterseniz gs4_auth() kullanabilirsiniz. Örneğin gs4_auth(email = "mine@example.com"), belirli bir e-posta adresiyle ilişkili belirtecin kullanılmasını zorunlu kılar. Kimlik doğrulama ayrıntıları için googlesheets4 kimlik doğrulama vinyetini okumanızı öneririz: https://googlesheets4.tidyverse.org/articles/auth.html.

20.3.6 Alıştırmalar

  1. Bölümün önceki kısmındaki students veri kümesini read_excel() ve read_sheet() fonksiyonlarına ek argüman vermeden hem Excel’den hem de Google E-Tablolar’dan okuyun. R’da ortaya çıkan veri çerçeveleri tamamen aynı mı? Değilse aralarındaki farklar nelerdir?

  2. https://pos.it/r4ds-survey adresindeki survey adlı Google E-Tablolar dosyasını, survey_id karakter ve n_pets sayısal değişken olacak biçimde okuyun.

  3. https://pos.it/r4ds-roster adresindeki roster adlı Google E-Tablolar dosyasını okuyun. Ortaya çıkan veri çerçevesi roster adını taşımalı ve aşağıdaki gibi görünmelidir.

    #> # A tibble: 12 × 3
    #>    group subgroup    id
    #>    <dbl> <chr>    <dbl>
    #>  1     1 A            1
    #>  2     1 A            2
    #>  3     1 A            3
    #>  4     1 B            4
    #>  5     1 B            5
    #>  6     1 B            6
    #>  7     1 B            7
    #>  8     2 A            8
    #>  9     2 A            9
    #> 10     2 B           10
    #> 11     2 B           11
    #> 12     2 B           12

20.4 Özet

Microsoft Excel ve Google E-Tablolar en popüler hesap çizelgesi sistemlerinden ikisidir. Bu dosyalarda saklanan verilerle doğrudan R’dan etkileşim kurabilmek bir süper güçtür! Bu bölümde Excel hesap çizelgelerinden readxl paketindeki read_excel(), Google E-Tablolar’dan ise googlesheets4 paketindeki read_sheet() ile R’a veri okumayı öğrendiniz. Bu fonksiyonlar birbirine çok benzer biçimde çalışır ve sütun adlarını, NA karakter dizilerini, dosyanın başında atlanacak satırları vb. belirtmek için benzer argümanlara sahiptir. Ayrıca ikisi de hesap çizelgesindeki tek bir çalışma sayfasını okumayı sağlar.

Öte yandan Excel dosyasına yazmak farklı bir paket ve fonksiyon (writexl::write_xlsx()) gerektirirken Google E-Tablolar’a googlesheets4 paketindeki write_sheet() ile yazabilirsiniz.

Sonraki bölümde farklı bir veri kaynağını ve buradan R’a veri okumayı öğreneceksiniz: veritabanları.