R'nin Excel Dosyalarını Okumak İçin Bir Pakete İhtiyacı Var
Temel R düz metin biçimlerini kutudan çıktığı gibi okur, ama .xlsx metin değildir - sıkıştırılmış bir XML demetidir ve ondan önceki .xls ikili bir biçimdi. Sizi bekleyen yerleşik bir read.xlsx() yoktur. Excel dosyalarını açmak için bir paket kurarsınız ve standart tercih readxl'dir: hem .xlsx hem .xls okur, dış bağımlılığı yoktur (Java yok, Excel kurulumu gerekmez) ve tek bir işi iyi yapar.
install.packages("readxl") # once per machine
library(readxl) # once per session
Bu sayfadaki parçacıklar readxl'in yerel olarak kurulu olmasını gerektirir; bu yüzden çalıştırılabilir bloklar yerine statik kod olarak gösterilir - onları kendi R oturumunuzda çalıştırın. Paketler sizin için yeniyse kısa sürümü şudur: install.packages() onu bir kez indirir, library() R'yi her başlattığınızda yükler.
read_excel(): Temeller
Tek bir çağrı, bir çalışma kitabının ilk sayfasını R'ye okur:
library(readxl)
sales <- read_excel("sales.xlsx")
head(sales)
str(sales)
Her içe aktarımdaki aynı alışkanlıklar: her sütunun türünü kontrol etmek için str(), ilk satırlara göz atmak için head(). Dosya bulunamıyorsa neden neredeyse her zaman çalışma dizinidir - file.exists("sales.xlsx") bunu bir saniyede söyler ve çözüm CSV dosyalarındakiyle aynıdır: tam bir yol kullanın ya da çalışma dizinini dosyanın klasörüne ayarlayın.
Geri gelen şey bir tibble'dır - tidyverse'ün veri çerçevesi yorumu. Yeni başlayan biri olarak yapacağınız her şeyde tam olarak bir veri çerçevesi gibi davranır (zaten öyledir, üstüne ekstralarla): $ sütun çıkarır, nrow() satır sayar, dplyr fiillerine akar. Görünür farklar kozmetik ve hoştur - her şeyi dökmek yerine yalnızca ilk on satırı, adların altında sütun türleriyle yazdırır. Eski bir fonksiyon düz veri çerçevesinde ısrar ederse as.data.frame(sales) dönüştürür.
Sayfa, Aralık Seçme ve Gereksizleri Atlama
Gerçek çalışma kitapları nadiren A1 hücresinden başlayan tek ve temiz bir tablodur. readxl'in argümanları alışıldık karmaşayı halleder.
Hangi sayfalar var? Okumadan önce sorun:
excel_sheets("report.xlsx")
# [1] "Summary" "Q1" "Q2" "Q3" "Raw data"
sheet = birini seçer, isme ya da konuma göre:
q3 <- read_excel("report.xlsx", sheet = "Q3")
raw <- read_excel("report.xlsx", sheet = 5)
İsmi tercih edin - birileri sekmeleri yeniden sıraladığı gün sheet = 5 sessizce yanlış sayfayı okur.
range = Excel'in kendi gösterimiyle tam bir dikdörtgen okur. Logo satırlarını, başlık satırlarını ve asıl tablonun çevresindeki başıboş notları atlamanın en temiz yolu budur:
budget <- read_excel("budget.xlsx", range = "B4:E20")
budget <- read_excel("budget.xlsx", sheet = "Plan", range = "B4:E20")
skip = ve col_names =, verinin üstünde kaç gereksiz satır olduğunu bilip nerede bittiğini bilmediğinizde daha gevşek alternatiftir:
# Data starts after 3 title rows, first real row is the header:
df <- read_excel("export.xlsx", skip = 3)
# No header row at all - supply names yourself:
df <- read_excel("export.xlsx", col_names = c("id", "region", "amount"))
col_names = TRUE (varsayılan) ilk satırı isim olarak kullanır; FALSE ise ...1, ...2 üretir ve birinci satırı veri sayar.
Excel Yazmak Farklı Bir Paket İster
readxl tasarım gereği salt okunurdur. Bir meslektaşınız sonuçlarınızı elektronik tablo olarak istediğinde en hızlı yol writexl'dir - bağımlılıksız tek satırlık bir çözüm:
install.packages("writexl")
writexl::write_xlsx(results, "results.xlsx")
Ham değerlerden fazlasına ihtiyacınız varsa - kalın başlıklar, dondurulmuş bölmeler, hücre renkleri, tek çalışma kitabında birkaç biçimli sayfa - orası openxlsx bölgesidir:
library(openxlsx)
write.xlsx(list(Summary = summary_df, Detail = detail_df), "report.xlsx")
İsimli bir liste, eleman başına bir sayfa olur. openxlsx Excel dosyalarını da okuyabilir, dolayısıyla doğada iki yönde de kullanıldığını göreceksiniz; düz okuma için readxl daha basit araç olarak kalır.
Pragmatik Alternatif: Bir CSV Dışa Aktarın
Bazen en az zekice çözüm kazanır. Çalışma kitabı tek seferlikse - biri size bir elektronik tablo yolladı ve sayılara şimdi ihtiyacınız var - onu Excel'de açın, "Farklı Kaydet" ile sayfayı CSV olarak dışa aktarın ve zaten bildiğiniz araçla okuyun:
df <- read.csv("sales.csv")
Paket yok, sayfa adı yok, birleştirilmiş hücre yok. Tam iş akışı CSV okuma sayfasındadır. Ödünleşimler: diğer sayfaları kaybedersiniz, biçimlendirmeye dayalı bilgiyi düzleştirirsiniz (bir şey "ifade eden" hücre renkleri - zaten bir veri tasarımı kokusu) ve dışa aktarma, kaynak dosya güncellendiğinde birinin unutacağı elle yapılan bir adımdır. Tekrarlayan bir işlem hattında .xlsx dosyasını doğrudan okuyun; tek seferlik bir içe aktarım için CSV dürüstçe gayet iyidir.
Klasik Excel İçe Aktarma Tuzakları
Excel dosyaları CSV'lerin taşımadığı sorunları taşır, çünkü elektronik tablolar insanların tabloların yapmaması gereken şeyleri yapmasına izin verir.
Tarihler sayı olarak gelir. Excel tarihleri sıralı bir gün sayısı olarak saklar; bir sütun türleri karıştırıyorsa ya da tuhaf biçimlendirilmişse, tarih beklediğiniz yerde 44688 bulabilirsiniz. readxl gerçek tarih hücrelerini genellikle doğru dönüştürür, ama ham sayıyı aldığınızda Excel'in başlangıcıyla dönüştürün - ki bu 1970 değil, 1899-12-30 tarihidir:
as.Date(44688, origin = "1899-12-30")
# [1] "2022-05-07"
Birleştirilmiş hücreler boşluklara ayrılır. Üç sütuna birleştirilmiş bir başlık, bir değer ve iki boş hücre olarak geri gelir; on satır boyunca birleştirilmiş bir kategori etiketi bir değer ve dokuz eksik değer olur. readxl, yalnızca görsel olarak var olan niyeti geri kazanamaz - içe aktarımdan sonra o boşlukları kendiniz doldurmayı bekleyin.
Başıboş tek bir hücre sütunu metne çevirir. Sütun türleri veriden tahmin edilir; dolayısıyla tek bir "n/a", sayıların arasına yazılmış bir not ya da "boş" bir hücredeki bir boşluk tüm sütunun character olarak gelmesine yol açar. Okuduktan hemen sonra str() bunu yakalar; tahmin sürekli yanılıyorsa col_types argümanı (ör. col_types = c("text", "numeric", "date")) meseleyi zorla çözer.
Ana tema: bir elektronik tablo, insanların üzerine çizdiği bir tuvaldir, bir tablo değil. Onu şüpheci şapkanızla okuyun, str() çalıştırın ve içe aktarıma güvenmeden önce birkaç değeri orijinaliyle doğrulayın.
Buradan Ne Çıkarıyorsunuz
- Temel R
.xlsxokuyamaz - readxl kurun, sonraread_excel("file.xlsx"). excel_sheets()çalışma kitabında ne olduğunu listeler;sheet =(isimleri tercih edin) birini seçer;range = "B4:E20"tam olarak istediğiniz tabloyu keser.- Geri bir tibble alırsınız - daha hoş yazdıran bir veri çerçevesi.
- Yazma farklı bir paketten geçer: düz çıktı için
writexl::write_xlsx(), biçimli çalışma kitapları için openxlsx. - Tek seferlik işlerde Excel'den CSV dışa aktarıp
read.csv()kullanmak gayet saygın bir kısayoldur. - Üç klasiğe dikkat edin: sıralı sayı olarak tarihler (başlangıç
1899-12-30), boşluğa dönüşen birleştirilmiş hücreler ve bir sütunu metne sürükleyen tek bir bozuk hücre.
Sırada: diğer yön - veri çerçevelerinizi CSV ve RDS dosyalarına yazmak.
Sıkça Sorulan Sorular
R'de bir Excel dosyası nasıl okunur?
readxl paketini bir kez install.packages("readxl") ile kurun, library(readxl) ile yükleyin, sonra read_excel("file.xlsx") çağırın. İlk sayfadan kurulmuş bir tibble (modern bir veri çerçevesi) döndürür. Farklı bir sayfayı isme ya da konuma göre okumak için sheet = argümanını kullanın.
R paketsiz Excel dosyalarını okuyabilir mi?
Hayır. Temel R'de .xlsx ya da .xls için okuyucu yoktur - bunlar metin değil, ikili/sıkıştırılmış biçimlerdir. Ya bir paket kullanırsınız (standart olan readxl'dir; openxlsx de çalışır) ya da sayfayı Excel'den CSV olarak dışa aktarıp hiç paket gerektirmeyen read.csv() fonksiyonunu kullanırsınız.
R'de bir Excel dosyasından belirli bir sayfa nasıl okunur?
read_excel fonksiyonuna sheet = geçirin: isme göre read_excel("report.xlsx", sheet = "Q3") ya da konuma göre sheet = 3. Çalışma kitabının ne içerdiğini bilmiyorsanız excel_sheets("report.xlsx") tüm sayfa adlarını bir character vektör olarak döndürür.
R'den bir Excel dosyası nasıl yazılır?
readxl yalnızca okur. Yazmak için tek satırlık çözüm writexl::write_xlsx(df, "out.xlsx") çağrısıdır. Biçimlendirmeye ihtiyacınız varsa - renkler, sütun genişlikleri, birden çok biçimlendirilmiş sayfa - bunun yerine programatik olarak biçimli çalışma kitapları kurabilen openxlsx paketini kullanın.