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(),xlsbiçimindeki Excel dosyalarını okur. -
read_xlsx(),xlsxbiçimindeki Excel dosyalarını okur. -
read_excel(), hemxlshem dexlsxbiç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.
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 6Verilerde 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:
-
Sütun adları tutarsızdır.
col_namesargümanıyla tutarlı bir biçim izleyen sütun adları verebilirsiniz;snake_caseyazı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 6Ne 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ı
skipargü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 -
favourite_foodsütunundaki gözlemlerden biri “mevcut değil” anlamına gelenN/Adeğeridir; ancak şu andaNAolarak tanınmamaktadır. BuN/Aile listedeki dördüncü öğrencinin yaşındaki eksik değer arasındaki farka dikkat edin. Hangi karakter dizilerininNAolarak tanınacağınınaargü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ücreNAolarak 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 -
Kalan sorunlardan biri,
agedeğişkeninin karakter türünde okunmasıdır; oysa sayısal olmalıdır. Düz dosyaları okumaya yarayanread_csv()ve benzeri fonksiyonlarda olduğu gibiread_excel()fonksiyonunacol_typesargü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 6Ancak bu da istediğimiz sonucu tam olarak vermedi.
agedeğişkeninin sayısal olması gerektiğini belirttiğimiz için sayısal olmayanfivedeğerini içeren hücreNAdeğ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.
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.
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.
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,FALSEveyaNAgibi 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.
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.
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 820.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
-
Aşağıdaki veri kümesini bir Excel dosyasında oluşturup
survey.xlsxolarak kaydedin. Alternatif olarak Excel dosyasını buradan indirebilirsiniz.
Ardından
survey_idkarakter,n_petssayı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 -
Aşağıdaki veri kümesini başka bir Excel dosyasında oluşturup
roster.xlsxolarak kaydedin. Alternatif olarak Excel dosyasını buradan indirebilirsiniz.
Ardından dosyayı R’a okuyun. Ortaya çıkan veri çerçevesi
rosteradı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 -
Aşağıdaki veri kümesini yeni bir Excel dosyasında oluşturup
sales.xlsxolarak kaydedin. Alternatif olarak Excel dosyasını buradan indirebilirsiniz.
a.
sales.xlsxdosyasını okuyupsalesolarak kaydedin. Veri çerçevesi, sütun adlarıidvenve 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 5b.
salesveri çerçevesini üç sütunlu (brand,id,n) ve yedi satırlı aşağıdaki düzenli biçime getirin.idvendeğişkenlerinin sayısal,branddeğ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 bake_saleveri çerçevesini yeniden oluşturup openxlsx paketindekiwrite.xlsx()fonksiyonuyla Excel dosyasına yazın.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ızstudents.xlsxdosyasını okuyup sütun adlarını “temizlemek” için bu fonksiyonu kullanın..xlsxuzantı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.
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 6Burada 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
Bölümün önceki kısmındaki
studentsveri kümesiniread_excel()veread_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?https://pos.it/r4ds-survey adresindeki survey adlı Google E-Tablolar dosyasını,
survey_idkarakter ven_petssayısal değişken olacak biçimde okuyun.-
https://pos.it/r4ds-roster adresindeki roster adlı Google E-Tablolar dosyasını okuyun. Ortaya çıkan veri çerçevesi
rosteradı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ı.