2013-08-15 6 views
5

文字列Aが文字列A(たとえば "MECH")の場合にのみ文字列Aを文字列Bに置き換える必要があり、Aが部分である場合に置き換えたくないより長い文字列(例えば、 "MECHANICAL")。今のところ、文字列Aが文字列全体であるかどうかを調べるgrepl()がありますが、置換の方法を理解することはできません。 grep()がTRUEを返すときにgsub()の置き換えを行うという考えでifelse()を追加しました。そうでなければ置き換えません。助言がありますか?以下のコードをご覧ください。ありがとう。私は文字列内thisのような単語全体のMECHが含まれている場合、取得するために正規表現を使用し(?<=\W|^)MECH(?=\W|$)条件付きで検索して置換する正規表現

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) 

答えて

2

:ちょうど\< \>エンクロージャを使用するよりも、他の後世のために

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

私は要素5に気付きました。それはMECHを置き換えませんでした。それはありますか? –

0

これは必要なものですか?あなたが唯一の単語全体と一致するように\\<\\>fromベクトル内の文字列を囲むことができ

0

を、単語全体が任意の文字列として定義することができますスペースまたは行末(\s|$)で終わります。

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

このアプローチの唯一の問題は、あなたがそれ故にスペースまたは行末あなたは試合の一部として使用され、括弧内にカプセル化し、後方参照(\1)上で実行する必要があるということです。

特殊な例外を除いて、この特定の質問については\< \>エンクロージャが優れています。ただし、例外がある場合は、より明示的な方法を使用することをお勧めします。ツールボックスのツールが多くなればなるほど、より良いものになります。

+0

またはカンマ、ドット、またはセミコロンなど。 – eddi

+0

@eddiうん、明示的にする必要があります。明示的に賛否両論があります。従来の柔軟性とスピードのトレードオフです。 – Dinre

関連する問題