2013-08-15 28 views
5

Sadece A dizesi (örn. "MECH") olduğunda, A dizesini A dizesiyle değiştirmem gerekiyor ve A parçası olduğunda değiştirme yapmak istemiyorum. Daha uzun bir dizgenin (örneğin "MEKANİK"). Şimdiye kadar, dize A'nın tam bir dizgisi olup olmadığını kontrol eden bir grepl() var, ama nasıl değiştirileceğini anlayamıyorum. Grep(), TRUE değerini döndürürse, aksi takdirde değiştirmemesi durumunda gsub() değiştirmeyi yapmayı düşünen bir ifelse() ekledim. Baska öneri? Lütfen aşağıdaki kodu inceleyin. Teşekkürler.Koşullu olarak bulmak ve değiştirmek için düzenli ifade

aa <- data.frame(type = c("CONSTR", "MECH CONSTRUCTION", "MECHANICAL CONSTRUCTION MECH", "MECH CONSTR", "MECHCONSTRUCTION")) 

from <- c("MECH", "MECHANICAL", "CONSTR", "CONSTRUCTION") 
to <- c("MECHANICAL", "MECHANICAL", "CONSTRUCTION", "CONSTRUCTION") 

gsub2 <- function(pattern, replacement, x, ...) { 
    for(i in 1:length(pattern)){ 
    reg <- paste0("(^", pattern[i], "$)|(^", pattern[i], ")|(", pattern[i], "$)|(", pattern[i], ")") 
    ifelse(grepl(reg, aa$type), 
      x <- gsub(pattern[i], replacement[i], x, ...), 
      aa$type) 
    } 
    x 
} 

aa$title3 <- gsub2(from, to, aa$type) 

cevap

2

Yalnızca tüm kelimeleri bulma \\< ve \\> yılında from vektörü dizeleri koyabilirsiniz.Eğer: Sadece kuşaklar için

x <- c("CONSTR", "MECH CONSTRUCTION", "MECHANICAL CONSTRUCTION MECH", 
     "MECH CONSTR", "MECHCONSTRUCTION") 

from <- c("\\<MECH\\>", "\\<CONSTR\\>") 
to <- c("MECHANICAL", "CONSTRUCTION") 

for(i in 1:length(from)){ 
    x <- gsub(from[i], to[i], x) 
} 

print(x) 
# [1] "CONSTRUCTION"      "MECHANICAL CONSTRUCTION"   
# [3] "MECHANICAL CONSTRUCTION MECHANICAL" "MECHANICAL CONSTRUCTION"   
# [5] "MECHCONSTRUCTION" 
+0

Öğe 5'te fark ettim, MECH'in yerini almadı. Olmalı mı? –

0

Ben dize içinde this gibi tüm sözcük MEK içeriyorsa almak için regex'i (?<=\W|^)MECH(?=\W|$) kullanın.

İhtiyacınız olan bu mu?

0

, \< \> muhafazası kullanılarak dışında, bütün bir kelime herhangi bir dize olarak tanımlanabilir Bir boşlukta veya satır sonunda sonlandırma (\s|$).

gsub("MECH(\\s|$)", "MECHANICAL\\1", aa$type) 

bu yaklaşımla tek sorun alanı veya sonuna-of-line maçın bir parçası, dolayısıyla parantez içinde kapsülleme ve geribaşvuru (\1) olarak kullanılan üzerinde taşımak için ihtiyaç vardır. Özel bir özel durumunuz olmadığından, bu özel soru için \< \> kasadan üstündür. Bununla birlikte, istisnalarınız varsa, daha açık bir yöntem kullanmak daha iyidir. Araç kutunuzdaki daha fazla araç, daha iyi.

+0

veya virgül veya nokta veya noktalı virgül, vb. – eddi

+0

@eddi Evet, açık olması gerekir. Açık olmak için hem artıları hem de eksileri vardır. Eski esneklik ve hız değiş tokuşu. – Dinre