write.csv() Bir Veri Çerçevesini Dışa Aktarır
Bir veri çerçevesini R'den çıkarıp başka programların açabileceği bir dosyaya sokmak tek bir çağrıdır:
write.csv(df, "results.csv", row.names = FALSE)
Ezberlenecek satır budur - birazdan gerekçelendireceğimiz row.names = FALSE dahil. İlk argüman veri çerçevesi, ikincisi dosya adıdır ve fonksiyon hiçbir şey döndürmez: tüm işi dosyayı oluşturma yan etkisidir.
write.csv() fonksiyonunun tam olarak ne ürettiğini diske dokunmadan görebilirsiniz, çünkü dosya adı beklediği her yerde herhangi bir bağlantıyı kabul eder - yalnızca yazdıran stdout() dahil:
İşte CSV'niz: bir başlık satırı, satır başına bir satır, tırnak içine alınmış metin değerleri, tırnaksız sayılar. (Tırnaklama varsayılan quote = TRUE ayarıdır; her yaygın CSV okuyucusu bunu halleder, o yüzden dokunmayın.) Gerçek bir dosyaya yazmak, stdout() yerine "results.csv" konmuş aynı çağrıdır.
row.names = FALSE Neden Varsayılanınız Olmalı
Her veri çerçevesi satır adları taşır - genellikle yalnızca 1, 2, 3... sayıları - ve write.csv() fonksiyonunun varsayılanı, onları boş başlıklı fazladan bir ilk sütun olarak dosyaya yazmaktır. Varsayılan çıktının nasıl göründüğüne ve o dosya R'ye gidiş-dönüş yaptığında ne olduğuna bakın:
Dışa aktarım, "1", "2" değerlerini tutan isimsiz bir ilk sütun kazandı - ve yeniden içe aktarımda read.csv() ona bir şey demek zorunda kaldı ve X adını uydurdu. Her yeni başlayanı şaşırtan gizemli X sütunu budur: veri değil, R'nin satır numaralandırmasının dosyanıza sızmasıdır. Bunu bir dışa-içe aktarma döngüsünde birkaç kez yapın; X, X.1, X.2 biriktirirsiniz...
Satır adları neredeyse hiçbir zaman gerçek bilgi taşımaz - taşıdıklarında da o bilgi zaten düzgün bir sütuna aittir. O yüzden row.names = FALSE bir refleks olsun. Tartışmasız varsayılan olmalıydı; geriye dönük uyumluluk nedenleriyle değil, dolayısıyla alışkanlık size düşüyor.
Dosya Nereye Düşer
write.csv(df, "results.csv") R'nin çalışma dizinine yazar - ve orası beklediğiniz yer değilse dosya kaybolmuş gibi görünür. Başarısız olmadı; yalnızca getwd() ne yazdırıyorsa o klasörde duruyor. Bu, okumadaki aynı tuzağın ayna görüntüsüdür ve aynı iki araç onu çözer:
getwd() # the folder your file went to
write.csv(df, "C:/Users/ada/results/out.csv", row.names = FALSE) # or: remove all doubt
Tam yollar (eğik çizgiler Windows dahil her platformda çalışır) betikleri belirsizlikten kurtarır. Çalışma dizininin nasıl ayarlanıp yönetildiği çalışma dizini sayfasında ele alınıyor.
Diğer Ayırıcılar İçin write.table() - ve Ekleme Sorusu
write.csv() aslında genel amaçlı write.table() fonksiyonunun virgüller için önceden yapılandırılmış ince bir sarmalayıcısıdır. Farklı bir biçime ihtiyacınız olduğunda - en yaygını sekmeyle ayrılmış - doğrudan write.table() çağırın:
Sekmeyle ayrılmış, tırnaksız - aşağı akıştaki birçok aracın tercih ettiği biçim. write.table() ile her şeyi açıkça ayarladığınıza dikkat edin; write.csv'nin virgül ya da tırnaklama varsayılanlarını devralmaz.
write.csv() fonksiyonunun yapmayı reddettiği bir şey ekleme yapmaktır: append = TRUE geçirmek, ayarın yok sayıldığına dair bir uyarı verir, çünkü ekleme yapmak başlık satırını dosyanın ortasına yeniden yazardı. Mevcut bir CSV'ye gerçekten satır eklemeniz gerekiyorsa - diyelim ki çalıştırmalar boyunca sonuç kaydediyorsanız - write.table() seviyesine inin ve başlığı kendiniz bastırın:
write.table(new_rows, "log.csv", sep = ",",
append = TRUE, col.names = FALSE, row.names = FALSE)
Ve tidyverse'teyseniz readr::write_csv(df, "out.csv"), read_csv() fonksiyonunun karşılığıdır: aynı çıktı, büyük çerçevelerde daha hızlı ve zaten en baştan satır adı yazmaz - hatırlanacak bir argüman eksik.
saveRDS() ve readRDS(): Tam Gidiş-Dönüşler
CSV kayıplı bir biçimdir. Yalnızca metin saklar, nokta - dolayısıyla bir Date sütunu "2026-08-07" metnine dönüşür, bir faktör seviye sıralaması kaybolmuş etiketlerine dönüşür, öznitelikler kaybolur ve her tür içe aktarımda yeniden tahmin edilmelidir (genellikle doğru, bazen değil - baştaki sıfırlar, sizden bahsediyoruz). Ayrıca CSV yalnızca tek bir dikdörtgen tablo tutabilir: bir uydurulmuş model, bir liste, dimnames'i olan bir matrisin hiçbir CSV karşılığı yoktur.
Dosya R için olduğunda - bugünün temizlenmiş verisini yarınki oturum için saklamak - metin biçimlerini tamamen atlayın:
saveRDS(df, "clean_data.rds") # today
df <- readRDS("clean_data.rds") # tomorrow: identical object, types intact
saveRDS() tek bir R nesnesini, herhangi bir nesneyi, tam olarak serileştirir. readRDS() onu bayt bayt geri verir: faktörler seviyelerini korur, tarihler hâlâ tarihtir, hiçbir şey yeniden tahmin edilmez. Her şeyde çalışır - bir veri çerçevesi, veri çerçevelerinden oluşan bir liste, uydurulmuş bir regresyon modeli. .rds dosyası sıkıştırılmış ikilidir, dolayısıyla genellikle CSV'den de küçüktür. Tek maliyeti, onu R'den başka hiçbir şeyin açamamasıdır - genel kuralın tam da bu olmasının nedeni budur: insanlarla ve diğer araçlarla paylaşmak için CSV, kendiniz için saklamaya RDS.
save() ve load() - ve RDS Neden Genellikle Kazanır
Daha eski bir ikiliyle de karşılaşacaksınız. save(), birden çok isimli nesneyi tek bir .RData dosyasına yazar ve load() onları geri yükler - çalışma alanınıza, orijinal isimleriyle:
save(df, model, params, file = "session.RData")
load("session.RData") # df, model, params silently appear
O kolaylık sorunun ta kendisidir. Değişken isimlerine load() karar verir, siz değil - nesneleri ortamınıza görülmeden yerleştirir ve o isimlere sahip olan her şeyin üzerine sessizce yazar. Altı ay sonra, yükleyip bakmadan session.RData dosyasının ne içerdiğini kimse hatırlamaz.
readRDS() dürüst arayüze sahiptir: ismi siz seçersiniz (df <- readRDS(...)), arkanızdan hiçbir şeyin üzerine yazılmaz ve bir dosya bir nesne demektir. Birkaç nesneyi tek bir dosyada demetlemeniz özellikle gerekmiyorsa RDS'i tercih edin. (Demet gerekiyorsa, nesneleri isimli bir listeye koyup listeyi saveRDS() ile kaydetmek aynı etkiyi hiç sürpriz olmadan verir.)
Buradan Ne Çıkarıyorsunuz
write.csv(df, "out.csv", row.names = FALSE)- dışa aktarımın tamamı ve evet, her zamanrow.names = FALSE.- Yeniden içe aktarımdaki gizemli
Xsütunu, satır adlarının dosyaya sızmasıdır; varsayılan onları yazdı, siz yazmamalısınız. - Dosyalar çalışma dizinine düşer -
getwd()"kayıp" dışa aktarımları bulur, tam yollar onları önler. write.table()diğer ayırıcıları ve (col.names = FALSEile) gerçek eklemeyi halleder;write.csv()bilinçli olarak ekleme yapamaz.saveRDS()/readRDS()herhangi bir R nesnesini tam olarak gidip getirir - türler, faktörler, öznitelikler eksiksiz. Paylaşmak için CSV, kendiniz için RDS.save()/load()yerine RDS'i tercih edin: açık isimler, sessiz üzerine yazma yok.
Sırada: bir içe aktarımda sizi ısırmadan önce kendi sayfasını hak eden bir veri türü - tarihler.
Sıkça Sorulan Sorular
R'de bir veri çerçevesi CSV'ye nasıl aktarılır?
write.csv(df, "output.csv", row.names = FALSE). row.names = FALSE kısmı önemlidir: onsuz R, içteki satır numaralarını fazladan bir ilk sütun olarak yazar ve bu, dosyayı biri yeniden içe aktardığında X adında gizemli bir sütun olarak ortaya çıkar.
Dışa aktardığım CSV'yi geri okuduğumda neden bir X sütunu var?
Çünkü write.csv'nin varsayılanı row.names = TRUE'dur - satır numaralarını isimsiz bir ilk sütun olarak yazdı ve read.csv geri okurken o sütuna X adını verdi. row.names = FALSE ile dışa aktarın; hayalet sütun kaybolur.
R'de write.csv ile saveRDS arasındaki fark nedir?
write.csv, herkesin açabileceği düz metin bir tablo üretir, ama yalnızca metin saklar - faktör seviyeleri, Date türleri, öznitelikler ve tablo olmayan nesneler düzleşir ya da kaybolur ve türlerin içe aktarımda yeniden tahmin edilmesi gerekir. saveRDS ise tek bir R nesnesini bayt bayt saklar; readRDS onu tam olarak eskisi gibi geri verir. Başkalarıyla paylaşmak için CSV, kendi R oturumlarınız için RDS kullanın.
write.csv dosyayı nereye kaydeder?
Tam bir yol vermediğiniz sürece R'nin mevcut çalışma dizinine. Nerede olduğunu görmek için getwd() çalıştırın - dosyanız buharlaşmış gibi görünüyorsa, getwd() ne yazdırıyorsa o klasörde duruyordur. "C:/Users/ada/results/out.csv" gibi tam bir yol geçirmek belirsizliği ortadan kaldırır.