R’da text (.txt) dosyası nasıl içeri aktarılır?

R’a dosya aktarlarında, daha fazla veriyi daha küçük boyutta saklayabildiği için genellikle düz text formatındaki dosyaları tercih edilir. Bu text dosyaları kendi içinde font ve stil gibi özellikler barındırmasa da yapısal barındırabilir. Veriler birbirinden farklı karakterler ile (tab, noktalı virgül veya boşluk) ayrılmış olabilir. Başlık satırı veya eksik veriler içerebilir.

Çeşitli yolları olsa da,  genellikle text dosyalarını 2 farklı komut ile R’ya aktarabilirsiniz. Bunlardan biri readLines(), diğeri ise read.table()‘dır.

Not: readLines ve read.table dışında, read.csv ve read.delim gibi komutlar da bulunmaktadır. Ancak bu komutlar, yukarıda bahsettiğim komutların belli dosya formatlarına göre özelleşmiş halleridir. Uygun parametreleri kullanarak tüm text dosyalarını readLines() ve read.table() komutları ile içeri aktarabilirsiniz.

readLines()

Bu komut dokümandaki her satırı tek tek okur. Her bir satır, içinde ne olursa olsun (ister tab, ister virgül, isterse smiley) tek bir nesne olarak içeri aktarılır. Genellikle her satırda bir nesnenin olduğu dosyaları içeri aktarmak için yararlıdır. Aynı zamanda read.table() komutunun hata verdiği durumlarda, dosyayı kontrol etmek için de kullanılır.

Şimdi isimler.txt adlı text dosyasını sisteme readLines() komutu ile yükleyelim.

Aşağıdaki komut ile dosyamızı içeri aldığımızda şu verileri görürüz.

ad1  <- readLines("isimler.txt")
print(ad1)
[1] "Can\tHolyavkin" "Mehmet Yılmaz" "Gizem" "Deniz" "Ebru" "Dilek" "Bahar" "Ali"

Görüldüğü gibi readLines() komutu, her satırdaki değeri bir bütün gibi içeri aktardı. İlk satırdaki ad ve soyad arasındaki tab karakterini \t ile, ikinci satırdaki boşluk karakterini de aynı boşluk olarak gösterdi.

readLines() komutunun beraberinde kullanıldığı bir çok parametre bulunmaktadır. Bu parametreler ile dosya içinde maksimum kaç satır okunabileceği ve benzeri kısıtlamalar getirilebilir. Bu özelliklerden ilerideki yazılarda bahsedeceğiz.

read.table():

Dosya içe aktarımlarının çoğunda bu komut kullanılır. Ayrılmış (tab seperated, comma separated, csv vb.) dosyaların, tablo halinde R sistemine aktarılmasında çok kullanışlıdır. Çok sayıda parametre ile txt dosyası formatında ne var ne yoksa esnek olarak içeri aktarılabilir.

Şimdi read.table() komutunu kullanarak isimler_2.txt dosyasını içeri aktaralım.

ad2 <- read.table("isimler_2.txt", header=TRUE, sep="\t", fill=TRUE, stringsAsFactors=FALSE)
print(ad2)
    Ad Soyad Şehir
[1] Can Şener İstanbul
[2] Mehmet Yılmaz Kayseri
[3] Gizem Aydın Adana
[4] Deniz Buruk 
[5] Ebru Gün Yozgat
[6] Dilek Pınar Denizli
[7] Bahar Ankara 
[8] Ali Dündar Bolu

Bu sefer kod içerisinde header ve sep gibi bazı parametreler kullandık. Bu parametreler fonksiyonu yönlendirerek , ilgili fonksiyonun doğru şekilde yerine getirilmesi için kullanılır.

header parametresi:

Dosyanın ilk satırının başlık olduğunu bildiğimiz için header = TRUE ifadesini ekledik. Eğer bu ifadeyi eklemeseydik veya header = FALSE olarak belirtseydik, R dosyanın ilk satırını (Ad Soyad Şehir) başlık olarak değil, bir veri olarak içeri aktaracaktı.

sep parametresi:

Kullanılan bir diğer parametre sep = "\t" , dosya içinde aynı satırda yer alan verilerin birbirinden hangi karakter ile ayrıldığını gösterir.  Bizim dosyamızda ad ve soyad “tab” karakteri ile ayrıldığı için bunu gösteren ifade olan \t yazdık. Eğer veriler boşluk ile ayrılsaydı sep = " " (tırnak içinde boşluk); eğer noktalı virgül ile ayrılsaydı sep = ";"  şeklinde belirtecektik.

fill parametresi:

Dikkat ettiyseniz, içeri aktardığımız dosyaların bir kısmında soyad ve şehir bilgisi yer almıyor. Kullandığımız read.table() komutu, içeri aktarılan verilerle bir tablo oluşturma (data.frame) davranışı içerdiğinden tüm kolonların dolu olacağını kabul eder. Bazı kolonlarda eksik veri olduğunda aşağıdaki hatayı verebilir.

Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : 
 4 . dize 3 öğeye sahip değil

Veriye baktığımızda 4. satırda yer alan dizede şehir kolonunun (3. öğe) veriye sahip olmadığını görürüz. Bu durumda, read.table() komutuna eksik verileri NA (eksik veri değeri) değeri ile doldurmasını fill=TRUE parametresi ile iletebiliriz. Eğer verinizde eksik yoksa bu parametreyi kullanmak zorunda değilsiniz.

stringsAsFactors parametresi:

Bu parametreyi anlamak için R’daki faktör kavramından bahsetmek gerek. R,  nümerik olmayan karakterleri (örn: Can, İstanbul gibi), faktör tipine dönüştürerek içeri alma eğilimindedir. Faktörler, kategorik değişkenleri belirler. Örneğin cinsiyet kolonunda “Erkek – Kadın – Diğer” gibi ifadeler faktör olarak adlandırılabilir. Faktörler o kolondaki kategorileri belirler ve ilgili kolona bu kategoriler dışında veri eklenemez. Bu durum bir anket hazırlarken belli bir soruya verilecek cevapları önceden belirlemenize benzer. 

stringsAsFactors=TRUE demek, R’a şunu demekle eşdeğerdir:

Bu dosyayı içeri aktar. Kolona bu anda eklediğim veriler, o kolonda olabilecek tüm olası seçenekleri içerir. Bundan başka veriler eklenemez.

Örneğin yukarıdaki dosya içeri aktarımında stringsAsFactors=FALSE yerine stringsAsFactors=TRUE olarak yazsaydık veriyi yine başarılı şekilde içeri aktarabilirdik.

ad2 <- read.table("isimler_2.txt", header=TRUE, sep ="\t", fill=TRUE, stringsAsFactors=TRUE)
print(ad2)
   Ad Soyad Şehir
[1] Can Şener İstanbul[
[2] Mehmet Yılmaz Kayseri
[3] Gizem Aydın Adana
[4] Deniz Buruk 
[5] Ebru Gün Yozgat
[6] Dilek Pınar Denizli
[7] Bahar Ankara 
[8] Ali Dündar Bolu

Ancak, bu satırlardan birini değiştirmek isteseydik hata alırdık.

ad2[1,1] <- "Ekrem"
Warning message:
In `[<-.factor`(`*tmp*`, iseq, value = "Ekrem") :
 invalid factor level, NA generated

Aldığımız hata bize şunu söylüyor:

Verileri içe aktarırken bana hiç Ekrem’den bahsetmedin. Ad kolonuna gelebilecek isimler belliydi. Bu isim nereden çıktı? Ben tanımam Ekrem’i falan. Onun yerine NA değeri ekliyorum.

Yukarıdaki örnekte,  dosya içeri aktarımında stringsAsFactors=TRUE değeri yüzünden, R’ın nümerik olmayan kolonları kategori olarak kabul etti. Yani, Ad kolonunda olabilecek tüm seçenekler, ilk başta adları girilen isimlerden (Can, Mehmet, Gizem …) ibaret oldu. Diğer bir deyişle ilgili kolona gelecek veriler çoktan seçmeli hale getirdik. Bu faktörler dışında bir değer girildiğinde, yeni veri (“Ekrem”) varolan kategoriler arasında olmadığı için hata aldık. Ancak, “Ekrem” yerine “Dilek” eklemek isteseydik, hata vermeyecekti. Çünkü “Dilek” ilk girilen veriler arasında bulunuyordu.

Bu parametreyi kod içinde yazılmadığında varsayılan değer olarak TRUE değerini alır. Eğer içeri aktaracağını verilere sonradan ekleme yapmanız gerekecekse bu değeri FALSE olarak çevirebilirsiniz.

Moleküler Biyolog ve Genetikçi.İstanbul Teknik Üniversitesi'nde doktora öğrencisi. 5 yıldır biyoinformatik ve yeni nesil dizileme üzerine çalışıyor. Genetik ve biyoinformatik üzerine Variant adlı blogda yazıyor.

Yorum bırakın:

Your email address will not be published.

Site Footer

Sliding Sidebar

Hakkımda

Hakkımda

Moleküler Biyolog ve Genetikçi. İstanbul Teknik Üniversitesi'nde doktora öğrencisi. 5 yıldır biyoinformatik ve yeni nesil dizileme üzerine çalışıyor.

Tweets

Please check your internet connection.