Dizelerdeki belirli karakterleri değiştirme


262

Excel'deki Bul ve Değiştir özelliğine benzer şekilde, bir vektör içindeki dizelerden belirli karakterleri kaldırmak istiyorum .

İşte başladığım veriler:

group <- data.frame(c("12357e", "12575e", "197e18", "e18947")

Sadece ilk sütunla başlıyorum; e'S kaldırarak ikinci sütun üretmek istiyorum :

group       group.no.e
12357e      12357
12575e      12575
197e18      19718
e18947      18947

Yanıtlar:


399

Düzenli bir ifade ve işlev ile gsub():

group <- c("12357e", "12575e", "197e18", "e18947")
group
[1] "12357e" "12575e" "197e18" "e18947"

gsub("e", "", group)
[1] "12357" "12575" "19718" "18947"

Ne gsubburada yaptığı yapılan her çağrının değiştirmektir "e"boş bir dize ile "".


Daha fazla yardım için ?regexpveya bölümüne bakın gsub.


15
fixed = TRUEbunu daha hızlı yapar.
Zengin Scriven

4
@RichScriven nedenini kısaca açıklayabilir misiniz?
sırlı

6
fixed=TRUER'nin daha esnek kalıp eşleşmesine izin veren ancak hesaplanması zaman alan normal ifadeler kullanmasını önler. Gerekli olan tek bir sabit "e" dizesini kaldırmaksa gerekli değildir.
mm689

Misiniz sub("e", "", group)aynı sonucu tutun?
Matheus Santana

sadece eher elementte bulduğu ilkinin yerini alacaktı
sindri_baldur

47

Düzenli ifadeler arkadaşlarınızdır:

R> ## also adds missing ')' and sets column name
R> group<-data.frame(group=c("12357e", "12575e", "197e18", "e18947"))  )
R> group
   group
1 12357e
2 12575e
3 197e18
4 e18947

Şimdi gsub()mümkün olan en basit değiştirme deseniyle kullanın: boş dize:

R> group$groupNoE <- gsub("e", "", group$group)
R> group
   group groupNoE
1 12357e    12357
2 12575e    12575
3 197e18    19718
4 e18947    18947
R> 

3
Ayrıca ...require(stringr);group$groupNoE <- str_replace(group$group, "e", "")
dickoa

26
"Temel fonksiyonları anlamayanların yerini almak zorunda kaldıklarını" söyleyebilirim. Kaynak dosyanızdaki alt çizgi sayısını artırmanın yanı sıra stringr burada tam olarak ne kazanıyor?
Dirk Eddelbuettel

8
" stringr, paketin yazarından R'nin string işlevlerini daha tutarlı, basit ve kullanımı kolay hale getiren bir dizi basit paketleyicidir ". Eğer söylediğiniz doğruysa (temel işlevleri sarmak için birçok alt çizgi ...) bu paketin var olmasının bir nedeni yoktur (feragatname: Temelde temel regex işlevlerini kullanıyorum ama yeni kullanıcılar için zor olabileceğini biliyorum ... )
dickoa

17
@dickoa: str_replacesarar sub, bu nedenle yalnızca desenin ilk oluşumunun yerini alacaktır. İle str_replace_allaynı davranışı istiyorsanız kullanmanız gerekir gsub.
Joshua Ulrich

24

Dizeleri değiştirmenin 2 yolunu özetleme:

group<-data.frame(group=c("12357e", "12575e", "197e18", "e18947"))

1) Kullanım gsub

group$group.no.e <- gsub("e", "", group$group)

2) stringrpaketi kullanın

group$group.no.e <- str_replace_all(group$group, "e", "")

Her ikisi de arzu çıktısını üretecek:

   group group.no.e
1 12357e      12357
2 12575e      12575
3 197e18      19718
4 e18947      18947

3
O zaman, çoğunlukla yorumlarda tartışıldığı gibi, tercih ettiğim yöntem olan stringr sözdizimini öğrenmek için yorumları içeren tüm sayfayı okumalısınız. Bu çözüm her iki seçeneği de hızlı bir şekilde sunuyor, bu yüzden teklif ettim. Benim umarım R için yeni olduğum zaman yapmak zorunda olduğum gibi diğer kullanıcıların filtrelemesine yardımcı olmaktı. Stringr bulmadan önce gsub ile mücadele ettim, çünkü son derece yükseltilmiş bir cevapta bahsedilmedi. Yine, amaç, oy toplamak değil, yeni R kullanıcılarına yardım etmeye çalışmaktır.
Megatron

Yararlı bulduğunuz ve bir cevaba dönüştürmeyi sevdiğiniz diğer cevaplarda / yorumlarda bilgi bulursanız, en azından bilgileri nereden aldığını göstermek / cevap vermek yerine sadece bir Comminuty Wiki yapmak için bazı atıflar sağlayabilirsiniz. kendi.
David Arenburg

Teşekkürler - bir dahaki sefere akılda kalacak. Daha önce bir topluluk wiki yapmadım, bu yüzden bir seçenek olduğunu bilmiyordum.
Megatron

1
Seçenek 2, veri çerçevesindeki bir veri sütununa, sütundaki tüm değerleri belirtmeden uygulandığında harika çalışır. Açıkçası seçenek 1 bir tekrardır, ancak seçenek 2 çok iyi çalışır ve eklenen işlevsellik için bir oylamayı hak eder.
Phil_T

6

İçindeki bazı karakterleri değiştirmek istiyorsanız, dizelerin vektöründen veri çerçevesi oluşturmanıza gerek yoktur. @Andrie ve @Dirk Eddelbuettel tarafından daha önce bahsedildiği için düzenli ifadeler bunun için iyi bir seçimdir.

Nokta gibi özel karakterleri değiştirmek istiyorsanız, aşağıdaki örnekte gösterildiği gibi tam düzenli ifade sözdizimi kullanmalısınız:

ctr_names <- c("Czech.Republic","New.Zealand","Great.Britain")
gsub("[.]", " ", ctr_names)

bu üretecek

[1] "Czech Republic" "New Zealand"    "Great Britain" 

Sadece onlardan kaçabilirsiniz, ancak tırnak içinde kaçış karakteri de kaçmak zorunda çünkü - tırnak içinde:gsub("\\.", " ", ctr_names)
Kamil S Jaron

4

Stringi paketini kullanın :

require(stringi)

group<-data.frame(c("12357e", "12575e", "197e18", "e18947"))
stri_replace_all(group[,1], "", fixed="e")
[1] "12357" "12575" "19718" "18947"

0
      library(stringi)

            group <- c('12357e', '12575e', '12575e', ' 197e18',  'e18947')

            pattern <- "e"  
            replacement <-  ""  
            group <- str_replace(group, pattern, replacement)      
            group    

[1] "12357"  "12575"  "12575"  " 19718" "18947" 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.