R'de Metin Oluşturma
R'de bir metin, tırnak içindeki yazıdır. Çift ve tek tırnak ikisi de çalışır ve tam olarak aynı anlama gelir; gelenek çift tırnaktır, metnin kendisi bir çift tırnak içerdiğinde tek tırnağa geçilir:
Ters eğik çizgi kaçışları çoğu dildeki gibi çalışır: gerçek bir tırnak için \", yeni satır için \n, sekme için \t, ters eğik çizginin kendisi için \\.
Şimdi her R acemisinin tam olarak bir kez yaptığı hata: bir metne uzunluğunu length() ile sormak.
nchar() karakterleri sayar - 5. length() ise vektör elemanlarını sayar ve tek bir metin, tek elemanlı bir vektördür - bu yüzden 1 der. R'de metin dahil her şey bir vektördür ve bu sayfadaki tüm fonksiyonlar sessizce bütün character vektörleri üzerinde eleman bazında çalışır. Buna şaşırmayı bıraktığınızda bu bir özelliktir.
Metinleri Birleştirme: paste() ve paste0()
R'de metinler için + yoktur. Birleştirme, argümanlarını varsayılan olarak bir boşlukla birleştiren paste() ile hiçbir şeyle birleştiren paste0()'dır:
paste vektörleştirilmiş olduğundan ona bir vektör vermek aynı anda birçok metin kurar - dosya adlarını, etiketleri ve kimlikleri tek satırda böyle üretirsiniz:
Ve collapse argümanı bunun tersini yapar: bütün bir vektörü, seçtiğiniz bir ayırıcıyla tek bir metne kaynaştırır:
Ayrımı hatırlayın: sep argümanlar arasındaki yapıştırıcıyı, collapse ise tek bir vektörün elemanları arasındaki yapıştırıcıyı denetler. İkisini tek bir çağrıda kullanabilirsiniz.
sprintf() ile Biçimlendirme
Metnin içinde biçimlendirilmiş sayılara ihtiyacınız olduğunda - sabit ondalık basamak, doldurulmuş genişlik - paste() yetersiz kalır ve devreyi sprintf() alır. C tarzı biçim kodları kullanır: metinler için %s, tam sayılar için %d, ondalıklar için %f:
%.1f "bir ondalık basamak", %.3f üç basamak ve %05d sıfırlarla beş haneye doldurma demektir. İkilenmiş %% gerçek bir yüzde işareti üretir. sprintf() de vektörleştirilmiştir, dolayısıyla tek bir çağrıda bütün bir değer sütununu biçimlendirebilir - sprintf() + cat() raporlama kalıbı için bkz. girdi ve çıktı.
Büyük/Küçük Harf ve Dilimleme: toupper(), tolower(), substr()
Harf dönüşümü tam olarak söylediği şeydir:
tolower(), karşılaştırmadan önce dağınık veriyi normalleştirirken ekmeğini çıkarır - "Yes", "YES" ve "yes" hepsi aynı değere dönüşür.
substr(x, start, stop), 1'den başlayarak karakter konumuna göre bir dilim çıkarır (R her yerde 1'den indekslidir):
Her iki uç da dahildir: 1'den 11'e kadar olan konumlar "Programming" verir.
Bul ve Değiştir: sub(), gsub() ve grepl()
sub() bir desenin ilk geçtiği yeri değiştirir; gsub() ("global substitute") ise hepsini değiştirir:
Kritik bir ayrıntı: desen varsayılan olarak düz metin değil, bir düzenli ifadedir. ., *, ( ve ? gibi regex karakterlerinin özel anlamları vardır - yalın bir . herhangi bir karakterle eşleşir. Metnin kendisini kastettiğinizde fixed = TRUE geçirin:
İlk satır a-b-c verir; ikincisi ----- verir, çünkü bir regex olarak . her karakterle eşleşti. Regex öğrenene kadar fixed = TRUE varsayılanınız olsun; hiç yanmazsınız.
grepl() değiştirmez - her elemanın eşleşip eşleşmediğini test eder ve bir logical vektör döndürür. Bu da onu metin filtrelemenin standart aracı yapar:
İlk sonuç hangi dosya adlarının .csv içerdiğini işaretler; ikincisi ise yalnızca eşleşenleri tutmak için o logical vektörü kullanır.
Bölme ve Kırpma: strsplit() ve trimws()
strsplit() bir metni ayırıcıya göre parçalar. Tek tuhaflığı: bir liste döndürür, çünkü aynı anda birçok metni bölebilir. Tek bir metin için [[1]] ile ilk elemanı alın:
Ve trimws(), gerçek dünya verisinin her zaman etrafına sarılı geldiği boşlukları temizler:
Varsayılan olarak iki ucu da kırpar; which = "left" veya "right" yalnızca bir tarafı kırpar (adlar metnin başına ve sonuna işaret eder).
stringr Alternatifi
Yukarıdaki her şey temel R'dir - her zaman kullanılabilir, kurulum gerektirmez. Tidyverse'ün stringr paketi aynı işlemleri tutarlı bir str_* isimlendirme şemasıyla ve metin her zaman ilk argüman olacak şekilde sarmalar; birçok kişi bunu hatırlamayı daha kolay bulur (kurulum için bkz. paketler):
library(stringr)
str_detect(files, "csv") # like grepl(), data first
str_replace_all(s, "good", "great") # like gsub(), arguments reordered
str_length("hello") # like nchar()
Temel R metin fonksiyonlarını her hâlükârda bilmeye değer - onlarla yazılmış her betikte, her Stack Overflow yanıtında ve her hata mesajında karşılaşırsınız. Önce temel isimleri öğrenin; tutarsız argüman sıraları sizi rahatsız etmeye başladığında stringr'ı benimseyin.
Buradan Ne Çıkarıyorsunuz
- Metinler gelenek olarak çift tırnak kullanır;
nchar()karakterleri,length()vektör elemanlarını sayar. paste()/paste0()ile birleştirin;separgümanları,collapsebir vektörü tek bir metne yapıştırır.sprintf()biçimlendirilmiş çıktıyı halleder:%s,%d,%.2f.sub()ilk eşleşmeyi,gsub()tüm eşleşmeleri değiştirir,grepl()eşleşmeyi test eder - hepsi varsayılan olarak regex, dolayısıyla düz metin içinfixed = TRUEgeçirin.strsplit()bir liste döndürür ([[1]]alın);trimws()doldurulmuş girdiyi temizler.
Sırada: metni programlarınıza sokup çıkarmak - print() ve cat() ile yazdırma ve kullanıcı girdisini okuma.
Sıkça Sorulan Sorular
R'de metinler nasıl birleştirilir?
paste() veya paste0() ile - R'de metinler için + yoktur. paste("data", "science") "data science" verir (varsayılan olarak boşlukla ayrılır); paste0("data", "science") ise hiçbir şeyle birleştirir. Ayırıcıyı değiştirmek için sep =, bütün bir vektörü tek bir metne kaynaştırmak için collapse = kullanın.
R'de bir metnin uzunluğu nasıl bulunur?
nchar("hello") karakter sayısı olan 5'i döndürür. length("hello") ise 1 döndürür - R'de length() bir vektörün elemanlarını sayar ve tek bir metin, tek elemanlı bir vektördür. length() ile nchar()'ı karıştırmak klasik acemi hatasıdır.
R'de sub() ile gsub() arasındaki fark nedir?
İkisi de bulup değiştirir, ama sub() yalnızca ilk eşleşmeyi değiştirirken gsub() ("global sub") tüm eşleşmeleri değiştirir. İkisi de deseni varsayılan olarak bir düzenli ifade sayar - bunun yerine metnin kendisiyle eşleşmek için fixed = TRUE geçirin.
R'de bir metin nasıl bölünür?
strsplit(x, split) bir desene göre böler, ama bir liste döndürür (çünkü aynı anda birçok metni bölebilir). Tek bir metin için ilk elemanı alın: strsplit("a,b,c", ",")[[1]], "a" "b" "c" character vektörünü verir.