Menu

R'de CSV Dosyalarını Okuma (read.csv ve read_csv)

read.csv() ile CSV dosyalarını R'ye nasıl içe aktarırsınız - önemli argümanlar, başarısızlıkların çoğuna yol açan çalışma dizini tuzağı ve readr::read_csv ne zaman değer.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

read.csv() Bir CSV Dosyasını Veri Çerçevesine Dönüştürür

R'de CSV okumak, dile gömülü tek bir fonksiyon çağrısıdır - paket gerekmez:

sales <- read.csv("sales.csv")

read.csv() dosyayı okur, ilk satırı sütun adı olarak kullanır, her sütun için bir tür tahmin eder ve bir veri çerçevesi döndürür. Uslu bir dosya için hikâyenin tamamı budur.

Onu hiç dosya olmadan da iş başında izleyebilirsiniz, çünkü read.csv() text argümanı üzerinden ham CSV metnini de kabul eder - aynı ayrıştırıcı, dosya adı yerine bir metinle beslenir:

str(), içe aktardığınız her şeyde çalıştıracağınız ilk şeydir: her sütunu tahmin edilen türüyle gösterir. Burada name character, score integer, passed logical olarak geldi - hepsi değerlerden tahmin edildi. Hızlı bir görsel kontrol için head(students) ilk satırları gösterir ve nrow(students) onları sayar. Sayısal olmasını beklediğiniz bir sütun chr olarak görünüyorsa, o sütunda sayı olmayan bir şey vardır - başıboş bir yorum, bir "N/A", bir binlik ayırıcı - ve düzeltme anı üç grafik sonrası değil, tam o andır.

Önemli Argümanlar

read.csv() fonksiyonunun düzinelerce parametresi vardır; yaklaşık beşini kullanacaksınız.

header - ilk satırın sütun adlarını tutup tutmadığı. Varsayılanı TRUE. Dosyanız doğrudan veriyle başlıyorsa header = FALSE geçirin; R sütunları V1, V2, ... diye adlandırır.

sep - alan ayırıcısı, varsayılanı ",". Avrupa'nın çoğunda CSV'ler noktalı virgül ayırıcıyla yazılır, çünkü orada virgül ondalık işaretidir. R tam da bunun için önceden yapılandırılmış bir çeşit sunar: read.csv2(), sep = ";" ve dec = "," kullanır:

Boylar düzgün sayı olarak çıkıyor - read.csv2, 1,63 ifadesinin bir nokta altmış üç demek olduğunu biliyordu. Bu dosyada düz read.csv kullansaydınız tek ve bozuk bir sütun alırdınız, çünkü hiçbir şey ondalık-olan-bir-virgülde doğru şekilde bölmez.

na.strings - hangi metinlerin eksik sayılacağı. Varsayılan olarak yalnızca "NA" eksik değer olur. Gerçek dışa aktarımlar eksik veriyi boş hücreler, "missing", "-", "NULL" olarak yazar - ve bunları bildirmedikçe metin olarak gelirler ve tüm sütunu character'a sürüklerler:

Doğru na.strings ile boşluklar gerçek NA olur ve score sayısal kalır. Onsuz "missing" yalnızca bir sözcüktür ve sütun metindir.

skip - veri başlamadan önce yok sayılacak satırlar. Dışa aktarımlar asıl tablonun üstüne bir iki başlık satırı koymaya bayılır; skip = 2 onların üstünden atlar.

colClasses - R'nin tahmin etmesine izin vermek yerine sütun türlerini zorlar. Klasik kurban, baştaki sıfırları olan her şeydir - posta kodları, telefon numaraları, ürün kimlikleri - R'nin tahmincisi bunları sayı olarak okur ve sıfırları yok eder:

00501, 501 oldu. Veri dosyada doğruydu ve R'de sessizce yanlıştı. colClasses = c("integer", "character"), ayrıştırıcıya her sütunun ne olduğunu sırayla söyler ve sıfırlar hayatta kalır.

Artık ihtiyacınız olmayan bir argüman: stringsAsFactors. R tarihinin büyük bölümünde read.csv(), aksini söylemedikçe her metin sütununu bir faktöre dönüştürdü ve bu muazzam bir kafa karışıklığına yol açtı. R 4.0'dan beri varsayılan FALSE'tur - metin metin olarak kalır. Eski eğitimlere serpilmiş hâlde hâlâ stringsAsFactors = FALSE göreceksiniz; güncel bir R'de zararsız ama gereksizdir.

Dosya Yolları: read.csv'nin Başarısız Olmasının 1 Numaralı Nedeni

Her R öğrencisinin ilk hafta karşılaştığı hata:

Error in file(file, "rt") : cannot open the connection
In addition: Warning message:
cannot open file 'sales.csv': No such file or directory

Dosya var - dosya yöneticinizde ona bakıyorsunuz. Ama R oraya bakmıyor. "sales.csv" gibi yalın bir dosya adı, R'nin çalışma dizinine göre çözülür ve o dizin genellikle dosyanızın bulunduğu klasör değildir. İki satır bunu teşhis eder:

getwd()                    # where R is actually looking
file.exists("sales.csv")   # FALSE means the path is wrong, full stop

file.exists() FALSE diyorsa, ne kadar yeniden çalıştırırsanız çalıştırın işe yaramaz - yolu düzeltin. Ya tam yolu verin (read.csv("C:/Users/ada/data/sales.csv") - eğik çizgiler Windows'ta da çalışır ve ters eğik çizgilerden daha güvenlidir) ya da setwd() ile R'nin çalışma dizinini veri klasörüne taşıyın. Çalışma dizininin ne olduğu, projelerin onu nasıl yönettiği ve betiklerdeki setwd() kullanımına neden hoş bakılmadığı çalışma dizini sayfasında ele alınıyor.

file.exists() refleks olsun. "Gizemli içe aktarma hatası"nı bir saniyede "bir yoldaki yazım hatası"na çevirir.

Doğrudan Bir URL'den CSV Okumak

read.csv(), dosya adı kabul ettiği her yerde bir URL de kabul eder ve dosyayı sizin için indirir:

url <- "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/penguins.csv"
penguins <- read.csv(url)
str(penguins)

Bu, eğitimler ve kamuya açık veri kümeleri için kullanışlıdır - indirme adımı yok, yol sorunu yok. Bedeli ise betiğinizin artık ağa ve o URL'nin hayatta kalmasına bağımlı olmasıdır; sık yeniden çalıştıracağınız her şey için bir kez indirin ve yerel kopyayı okuyun.

readr::read_csv - Daha Hızlı, Daha Konuşkan Alternatif

Tidyverse kendi CSV okuyucusunu readr paketinde sunar: read_csv() (nokta değil alt çizgi). Bilmeye değer, çünkü okuyacağınız modern R kodunun çoğu onu kullanır:

install.packages("readr")   # once
library(readr)              # every session

flights <- read_csv("flights.csv")

read.csv() fonksiyonundan pratik farkları:

  • Hız - yüz binlerce satırlı dosyalarda gözle görülür biçimde daha hızlı.
  • Bir tibble döndürür - konsolunuzu boğmak yerine derli toplu bir önizleme yazdıran modernleştirilmiş bir veri çerçevesi.
  • Tahminlerini bildirir - okuduktan sonra her sütunun saptanan türünü yazdırır; böylece sayı beklediğiniz hâlde character olarak ayrıştırılan bir sütun, sonradan sürpriz olmak yerine anında görünür.
  • Sütun adlarını asla bozmaz - read.csv(), first name gibi bir başlığı first.name olarak yeniden yazar; read_csv() onu olduğu gibi korur.

Küçük bir dosya için iki fonksiyon da uygundur. Dosyalar büyüdüğünde ya da betiğinizin geri kalanı zaten tidyverse olduğunda read_csv() fonksiyonuna uzanın. Yollar, ayırıcılar (read_csv2() de vardır) ve eksik değer metinleri (na =) hakkında yukarıda anlatılan her şey, argüman adları biraz farklı olsa da geçerlidir.

Analiziniz bittiğinde geri dönüş yolculuğu - sonuçlarınızı bir dosyaya aktarmak - write.csv sayfasındadır.

Buradan Ne Çıkarıyorsunuz

  • df <- read.csv("file.csv") bir CSV'yi veri çerçevesine okur; hemen str() ve head() ile kontrol edin.
  • read.csv(text = "...") bir CSV metnini doğrudan ayrıştırır - denemeler ve küçük örnekler için harikadır.
  • Ekmeğini çıkaran argümanlar: header, sep (ya da noktalı virgüller için read.csv2), na.strings, skip, colClasses.
  • "Cannot open file", çalışma dizininin sandığınız yerde olmadığı anlamına gelir - getwd() ve file.exists() bunu anında çözer.
  • readr::read_csv() daha hızlı tidyverse sürümüdür: tibble'lar, bildirilen sütun türleri, dokunulmamış adlar.

Sırada: hiç düz metin olmayan dosyalar - readxl paketiyle Excel elektronik tablolarını okumak.

Sıkça Sorulan Sorular

R'de bir CSV dosyası nasıl okunur?

read.csv("file.csv") ile - yerleşiktir, paket gerekmez. İlk satırı sütun adı olarak kullanarak CSV sütunu başına bir sütun içeren bir veri çerçevesi döndürür. Sonucu bir değişkene atayın: df <- read.csv("sales.csv"), sonra str(df) ve head(df) ile kontrol edin.

read.csv neden 'cannot open file: No such file or directory' diyor?

R dosyayı çalışma dizinine göre arıyor ve o dizin muhtemelen dosyanızın bulunduğu klasör değil. R'nin nereye baktığını görmek için getwd(), ıskaladığını doğrulamak için file.exists("file.csv") çalıştırın. Tam bir yol vererek ya da çalışma dizinini dosyanın klasörüne ayarlayarak düzeltin.

R'de read.csv ile read_csv arasındaki fark nedir?

read.csv() temel R'dir - her zaman kullanılabilir, düz bir veri çerçevesi döndürür. read_csv() readr paketinden gelir - büyük dosyalarda daha hızlıdır, bir tibble döndürür, sütun adlarınıza asla dokunmaz ve tahmin ettiği sütun türlerini yazdırır; böylece hatalı ayrıştırmaları anında yakalarsınız. Küçük dosyalarda ikisi de uygundur; büyük dosyalarda ya da tidyverse işlem hatlarında read_csv() kullanın.

R'de noktalı virgülle ayrılmış bir CSV nasıl okunur?

read.csv2("file.csv") kullanın - Avrupa geleneği için önceden yapılandırılmış read.csv'dir: ayırıcı olarak noktalı virgül, ondalık işareti olarak virgül. Ya da düz read.csv() fonksiyonuna sep = ";" (ve gerekirse dec = ",") geçirin.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA