stringr: Yazı Düzenleme Paketi

Veri kaynaklarındaki yazılar, bazı durumlarda istemediğiniz veya karışıklık yaratacak değerler taşıyabilir. Herhangi bir veri setinde yer alan yazıları (strings) toplu şekilde düzenleyebilmeniz için kullanışlı bir pakete değineceğiz: stringr

Paket, içinde çok sayıda fonksiyon barındırsa da bunları 4 ana gruba ayırmak mümkün:

  • Harf değişiklikleri: Bu fonksiyonlar, yazı içindeki harf / harf öbekleri üzerinde çeşitli değişiklikler yapmayı sağlar.
  • Boşluk değişiklikleri: Veriye boşluk ekleme, çıkarma ve değiştirme gibi işlemleri kapsar.
  • Örüntü (Pattern) tanıma işlemleri: Yazı içinde, belirlediğiniz kurallara uygun nesneleri tespit etmenizi ve değiştirmenizi sağlar.

Kurulum:

> library.install("tidyverse")
> library(stringr)

Temel Uygulamalar:

Paketin uygulamalarına öncelikle temel fonksiyonlardan başlayalım. stringr içinde verideki yazıların genel özelliklerine ait bilgi edinmek için çok sayıda fonskiyon yer alır.

Yazının uzunluğunu bulmak:

Örneğin, bir yazıdaki karakter sayısını tespit etmek için str_length() fonksiyonu kullanılabilir. Bu fonksiyon, boşluk ve noktalama işaretleri dahil tüm karakterlerin sayısını verecektir. Aynı işlem R’ın çekirdek fonksiyonlarından nchar() ile de gerçekleştirilebilir.

> str_length("ab: cd")
[1] 6
Yazı İçinden Parça Almak:

Bir nesnenin başındaki, ortasındaki veya sonundaki karakterleri çekebilmek için  str_sub() fonksiyonu kullanılır. Fonksiyon 3 değişkene ihtiyaç duyar. Bunlardan biri, yazı içeren vektör,  çekilecek kısmın ilk harfin konumu ve son harfin konumu. Eğer konum değerleri negatif olarak belirtilirse, son kısımdan saymaya başlar.

sehir <- c("adana 01", "istanbul 34")

> str_sub(sehir, 1, 3)
[1] "ada" "ist"

> str_sub(sehir, -2, -1)
[1] "01" "34"

Bu fonksiyonu, seçilen parçaları başka bir yazı ile değiştirmek için de kullanabilirsiniz.

> str_sub(sehir, -2, -1) <- "xx"
[1] "adana xx", "istanbul xx"
Boşluk Eklemek ve Çıkarmak:

Yazı içeren bir vektördeki nesnelere boşluk eklemek veya başındaki/sonundaki boşlukları kaldırmak için str_trim()  ve  str_pad() fonksiyonlar kullanılır.

Bir nesnenin başındaki veya sonundaki boşluklar (boşluk sayısından bağımsız olarak) str_trim() fonksiyonu ile kaldırılabilir.

sehir2 <- c("     adana", " istanbul   ")

> str_trim(sehir2)
[1] "adana"  "istanbul"

Bunun tam tersi olarak boşluk eklemek için str_pad fonksiyonu kullanılır. Boşluk eklenecek konumu “right“, “left” ve “both” parametreleri ile belirleyebilirsiniz.

sehir3 <- c("adana 01", "istanbul 34")

> str_sub(sehir3, 5, "both") 
[1] "     adana 01     "   "     istanbul 34     "
Büyük Küçük Harf Değişimi Yapmak:

Yazı içeriğindeki harflerde büyük ve küçük harf değişimi yapmak için str_to_upper() ve str_to_lower() fonksiyonları kullanılır. Yazıyı başlık formatına (sadece ilk harfleri büyük) çevirmek için str_to_title() kullanılabilir

> str_to_lower("benim adım CAN") 
[1] "benim adım can"

> str_to_upper("benim adım CAN") 
[1] "BENIM ADIM CAN"

> str_to_title("benim adım CAN") 
[1] "Benim Adım Can"

İleri Uygulamalar:

stringr paketinin esas gücü, vektör içinde belli kuralların aratılması ve kurallara uyan nesnelerde bağlı değişikliklerin gerçekleştirilmesinden gelir.

Kurala Göre Arama, çıkarma ve sayma yapmak:

Yazı içeren vektörler içinde, sizin belirlediğiniz kuralın hangi nesnelerde bulunduğunu görmek için str_detect() fonksiyonu kullanılır. Bu fonksiyon logical (TRUE/FALSE) bir vektör üretir. İlgili vektörden kurala uyumlu nesneleri ayıklamak için str_subset() fonksiyonu kullanılabilir. Ayrıca, her nesne içinde seçtiğiniz kurala uyumlu kaç karakter olduğunu da str_count() fonksiyonu ile belirleyebilirsiniz.

telefon <- c("0555 324 2343", "Telefon: 0212 3234243", "İstanbul")

> str_detect(telefon, "[0-9]")
[1] TRUE TRUE FALSE

> str_subset(telefon, "[0-9]")
[1] "0555 324 2343" "Telefon: 0212 3234243"

> str_count(telefon, "[0-9]")
[1] 11 11 0
Regular Expressions (Kurallı İfadeler)

Bu noktada biraz kurallardan bahsetmekte fayda var. Bu kurallar genellikle Regular Expressions veya kısaca Regex olarak bilinirler. Çoğu programlama dilinde arama yapmak için sıkça kullanılır. R’da desteklenen Regex parametrelerine kısaca göz atalım.

  • . : Nokta karakteri, oluşturulan kural içinde herhangi bir karakter olabileceğini belirtir.
  • \\ : Nokta, soru işareti gibi bazı karakterleri vektör içinde aratmak isterseniz, bunları doğrudan kural içine ekleyemezsiniz. Çünkü bu karakterlere başka fonksiyonlar atanmıştır. Örneğin “.” ifadesi, herhangi bir karakteri belirtir. Nesnelerdeki “gerçek noktaları” belirlemek için başına \\ ifadesi eklenir. Bu şekilde kullanmanız gereken karakterler şunlardır: $ * + . ? [ ] ^ { } | ( ) \
> str_count("mer.ha.ba", ".")
[1] 9


> str_count("mer.ha.ba", "\\.")
[1] 2
  • [x,y,z] : Köşeli parantez içinde yazacağınız her bir karakter ayrı ayrı aratılır. Bir aralık belirtmek için – karakteri kullanılabilir.
  • ^[x] ve [y]$ : Belirtilen karakterlerin nesnenin sadece başında olacağını istiyorsanız “^”; sonunda olmasını isteniyorsa “$” ifadesi ile gösterilir.
  • [:digit:] : Tüm rakamları belirtir. Eğer sadece belli rakamlarla ilgileniyorsanız, o zaman [0,1,2,3] gibi teker teker yazarak veya [0-3] gibi aralık belirterek kural oluşturabilirsiniz.
  • [:alpha:] : Alfabetik karakterleri belirtir. Özel bir harf grubu aranıyorsa [a,b,c] gibi tek tek yazarak veya [a-c] gibi aralık belirtebilirsiniz.
  • [:alnum:] : Tüm alfabetik ve numerik karakterleri belirtir.
  • [:upper:] ve [:lower:] : Büyük ve küçük alfabetik karakterleri belirtir.
  • [:space:] : Boşluk ve tab karakterlerini aramak için kullanılır.
  • [:punct:] : Noktalama işaretlerini belirtir
  • ([x,y]{3}) : Önceki ifadenin kaç defa tekrarlanacağını gösterir. Tekrar edilecek ifade, tekrar sayısı ile birlikte parantez içine alınır.

Örnek:

Örneğin bir vektör içindeki özel bir formatla yazılmış telefon numaralarını kontrol etmek istiyoruz. Aradığımız format da şu olsun: (0555) 414 94 95

telefon2 <- c("(0555) 414 94 95","0215 324 4353")
kural <- "[\\(][0][5][0-9][0-9][\\)][:space:]([0-9]{3})[:space:]([0-9]{2})[:space:]([0-9]{2})"

> str_detect(telefon2,kural)
[1] TRUE FALSE
Yazı içeriğini değiştirmek:

Nesneler içindeki kurala uygun parçaları, istediğiniz başka bir parça ile değiştirmek için str_replace_all() fonksiyonlarını kullanabilirsiniz. Bu fonksiyon arattığınız kurala uyan tüm eşleşmeleri değiştirecektir. Alternatif olarak str_replace() fonksiyonu ise sadece bir nesne içindeki ilk eşleşmeyi değiştirecektir.

telefon3 <- c(
  "Elektrikçi", 
  "(0555) 414 94 95", 
  "(0524) 234 23 12", 
  "İş: (0512) 324 11 32; Cep: (0555) 414 94 95"
)

kural <- "[\\(][0][5][0-9][0-9][\\)][:space:]([0-9]{3})[:space:]([0-9]{2})[:space:]([0-9]{2})"

> str_replace(telefon3,kural)
[1] "Elektrikçi" 
[2] "(xxxx) xxx xx xx" 
[3] "(xxxx) xxx xx xx" 
[4] "İş: (xxxx) xxx xx xx; Cep: (0555) 414 94 95"

> str_replace_all(telefon3,kural)
[1] "Elektrikçi" 
[2] "(xxxx) xxx xx xx" 
[3] "(xxxx) xxx xx xx" 
[4] "İş: (xxxx) xxx xx xx; Cep: (xxxx) xxx xx xx"
Yazıları Bölmek:

Yazı içeren nesneleri bir karakterden sonra ayırmak için str_split() fonksiyonu kullanılır. Oluşacak parça sayısını belirlemek isterseniz str_split_fixed(,n=) ifadesi de tercih edilebilir.

str_split("benim adım can"," ")
[1] "benim" "adım" "can"

str_split_fixed("benim adım can", " ", n=2)
[1] "benim" "adım can"

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

Message: Invalid or expired token., Please check your Twitter Authentication Data or internet connection.