2015-11-27 17 views
7

Alfabetik [a-z], boşluk [] ve kesme işareti ['] içeren bir dize değişkeni var. x <- "a'b c" Kesme işareti ['] ile boş [] yerine geçmek ve [] ile alt alanı [] değiştirmek istiyorum.Birden çok dizeyi R? 'Deki bir gsub() veya chartr() deyiminde değiştirin.

x <- gsub("'", "", x) 
x <- gsub(" ", "_", x) 

Kesinlikle çalışır, ancak çok fazla koşulum olduğunda kod çirkinleşir. Bu nedenle, chartr()'u kullanmak istiyorum, ancak chartr() boş bırakılamıyor, örn.

x <- chartr("' ", "_", x) 
#Error in chartr("' ", "_", "a'b c") : 'old' is longer than 'new' 

Bu sorunu çözmenin bir yolu var mı? Teşekkürler!

+1

Zaten onu iki gsub ile çözdünüz. Çok çirkin görünüyorsa, sanırım "güzel" olan kendi sarmalayıcı işlevinizi yaratabilirsiniz. Fakat 'chartr' özelliğini kullanamazsınız çünkü "boş" bir karakter değildir, bir karakter eksikliğidir. – MrFlick

cevap

5

Ne magrittr paketinden %<>% ve %>% opperators sağlayan sözdizimi fanatiğiyim gsubfn

library(gsubfn) 
gsubfn(".", list("'" = "", " " = "_"), x) 
# [1] "ab_c" 
9

kullanabilirsiniz.

library(magrittr) 

x <- "a'b c" 

x %<>% 
    gsub("'", "", .) %>% 
    gsub(" ", "_", .) 
x 
##[1] "ab_c" 

gusbfn harika, ama ben zincirleme %>% verir gibi. Ben de, bir magrittr ve/veya dplyr çözümü tercih ederim

+1

Üçüncü argümanın anlamı nedir. gsub() – Ali

+2

Varsayılan olarak, "%>%' nin sol tarafındaki nesne, sağ taraftaki ilk bağımsız değişkene * aktarılmış *. Eğer LHS'nin bu örnekte olduğu gibi üçüncü argümanı olması gerekiyorsa, o zaman '.' yer tutucudur. Daha fazla bilgi için vinyet ("magrittr") 'a bakın. – Peter

0
gsub("\\s", "", chartr("' ", " _", x)) # Use whitespace and then remove it 
0

. Ancak, özellikle bir işlevdeyse ve ucuz bir şekilde iade edilebiliyorsa, nesnenin yeni bir kopyasını yapmayı tercih etmiyorum.

yani

return(
    catInTheHat %>% gsub('Thing1', 'Thing2', .) %>% gsub('Red Fish', 'Blue 
    Fish', .) 
) 

... vb.

İlgili konular