2017-02-01 48 views
0

我有很多不洁数据的形式:的R - 使用GSUB替换字符串()

abc 
abc/def 
abc/de 
abc/d 
abc/def/i j k 
abc/def/i 
abc/def/i j 

这仅仅是我想改变的数据的一部分。这是更大的一组数据的一部分。

我想将所有元素更改为abc/def/i j k。 我已经使用了gsub()功能如下:

gsub('abc[a-z/]', 'abc/def/i j k', str) 

输出

abc/def/i j k 
abc/def/i j k/def 
abc/def/i j k/de 
abc/def/i j k/d 

的问题是它取代了图案的任何发生。

那里我得到了足够体面的结果,唯一的解决办法是在那里我硬编码的所有这样可能的选项:

gsub('abc$|abc/d$|abc/de$|abc/def/i$', 'abc/def/i j k', str) 

但是,这不会,如果有任何新的数据的变化工作。 所以我想知道是否有可能得到没有硬编码参数的结果。

+0

所以其他0+字符,被'abc' /'def'占位符?否则,'^ abc [a-z /] * $'将与'sub'一起使用。 –

+1

如果我理解正确,你希望所有的元素都变成“abc/def”,那么为什么不使用'rep(“abc/def”,length(str))'? –

+0

试试'sub(“(abc)[/ az] *”,“\\ 1/def”,x)'或'sub(“^(abc)[/ az] * $”,“\\ 1/def “,x)' –

回答

2

您可以使用

x <- c("abc", "abc/def","abc/de","abc/d","abc/def/i j k","abc/def/i","abc/def/i j") 
sub("^(abc)(?:/[^/]*)?", "\\1/def", x) 
## => [1] "abc/def"  "abc/def"  "abc/def"  "abc/def"  
## [5] "abc/def/i j k" "abc/def/i"  "abc/def/i j" 

R demo

详细

  • ^ - 字符串的开始
  • (abc) - 第1组:abc
  • (?:/[^/]*)? - 任选的组相匹配的序列:
    • / - 一个/
    • [^/]* - 比/
+1

我再次检查。有效。谢谢。 –