Вставьте точки вокруг подстроки, используя gsub в R

Я хотел бы иметь функцию в R, которая вставляет точки («».») вокруг заданной подстроки (например, «альфа»), если они еще не присутствуют. Например. string="10-alpha-epoxy-Amorph-4-ene" должен вернуться

"10-.alpha.-epoxy-Amorph-4-ene"

string="alpha-cadolene" должен вернуться

".alpha.-cadolene"

но string=".alpha.-cadolene" должен вернуться

".alpha.-cadolene"

(подстрока может встречаться несколько раз)

Какой самый простой способ сделать это с помощью gsub в R?

привет, Том


person Tom Wenseleers    schedule 04.01.2014    source источник


Ответы (2)


Я бы сделал что-то вроде этого:

gsub("[.]?(alpha)[.]?", ".\\1.", c("10-alpha-epoxy-Amorph-4-ene",
                               ".alpha.-cadolene", "alpha.-cadolene",
                                ".alpha-cadolene"                              
                                 ))
[1] "10-.alpha.-epoxy-Amorph-4-ene" ".alpha.-cadolene"             
    ".alpha.-cadolene"              ".alpha.-cadolene"  

EDIT Обобщение многих терминов:

Если у вас есть список терминов, вы можете использовать регулярное выражение для создания тура, используя paste:

terms <- c('alpha','gamma','beta','delta')

gsub(paste0("[.]?(",paste0(terms,collapse='|'),")[.]?"), ".\\1.", 
                c("10-alpha-epoxy-Amorph-4-ene",
                 ".gamma.-cadolene", "beta.-cadolene",
                 ".delta-cadolene")) 

[1] "10-.alpha.-epoxy-Amorph-4-ene" ".gamma.-cadolene"             
    ".beta.-cadolene"              
[4] ".delta.-cadolene"  

EDIT получить список greels в полном письме:

library(XML)
dat <- readHTMLTable("http://en.wikipedia.org/wiki/Greek_alphabet",
                     strinsAsFactors=FALSE)[[2]]

terms <- as.character(dat$V2[-c(1,2)])
 [1] "alpha"   "beta"    "gamma"   "delta"   "epsilon" "zeta"    "eta"     "theta"   "iota"    "kappa"   "lambda" 
[12] "mu"      "Name"    "Modern"  "nu"      "xi"      "omicron" "pi"      "rho"     "sigma"   "tau"     "upsilon"
[23] "phi"     "chi"     "psi"     "omega"  
person agstudy    schedule 04.01.2014
comment
И можно ли это также обобщить, чтобы вы могли сделать это для совпадения с альфой, бета, гаммой, дельтой и т. Д.? Или для этого потребуются отдельные команды gsub? - person Tom Wenseleers; 04.01.2014
comment
ты имеешь в виду всех греков? - person agstudy; 04.01.2014
comment
Да, все греки были бы идеальными! Но я не знаю, доступно ли что-то стандартное для определения всех греческих букв, написанных полностью... (на самом деле, я все еще искал какую-нибудь команду для преобразования из греческих символов UTF-8 в буквы, написанные полностью в латиница, и наоборот - сейчас я это сделал вручную с серией замен) - person Tom Wenseleers; 05.01.2014
comment
давайте продолжим это обсуждение в чате - person agstudy; 05.01.2014

Вот один из способов:

R> gsub("-(alpha)-", ".-\\1-.", "10-.alpha.-epoxy-Amorph-4-ene")
[1] "10-.alpha.-epoxy-Amorph-4-ene"
R> gsub("-(alpha)-", ".-\\1-.", "10-alpha-epoxy-Amorph-4-ene")
[1] "10.-alpha-.epoxy-Amorph-4-ene"
R> 

Выражение (....) сохранено, что позволяет легко вспомнить его в замещающей части как \\1 (где вторым таким выражением будет \\2).

Но явно называя выражение, вы гарантируете, что другое совпадение не может произойти. Вы, конечно, можете обобщить это:

gsub("-([a-z]*)-", ".-\\1-.", "10-.alpha.-epoxy-Amorph-4-ene")

заменит любое выражение из строчных букв (но не знаки препинания, цифры и т. д.).

person Dirk Eddelbuettel    schedule 04.01.2014