2015-11-17 57 views
1

在以下示例中,如何在italic(P) == 0italic(P) < 0.001之间替换那些实例?在R中查找并替换

df <- structure(list(STRING = c("italic(R)^2 == 0.15 * \",\" ~ italic(P) == 0", "italic(R)^2 == 0 * \",\" ~ italic(P) == 0", 
"italic(R)^2 == 0.17 * \",\" ~ italic(P) == 0", "italic(R)^2 == 0.15 * \",\" ~ italic(P) == 0", 
"italic(R)^2 == 0 * \",\" ~ italic(P) == 0", "italic(R)^2 == 0.07 * \",\" ~ italic(P) == 0.002", 
"italic(R)^2 == 0.12 * \",\" ~ italic(P) == 0", "italic(R)^2 == 0.11 * \",\" ~ italic(P) == 0", 
"italic(R)^2 == 0.06 * \",\" ~ italic(P) == 0.006", "italic(R)^2 == 0.08 * \",\" ~ italic(P) == 0.001" 
)), .Names = c("STRING"), row.names = c(NA, -10L), class = "data.frame") 

我想gsub("== 0", "< 0.001", df$STRING)但这显然是错误的,因为它也将取代所有其他实例中的型样。我只想替换那些是0而不是0.

我可以在fix(df)弹出窗口中手动更改它,但那不是很好的做法。

回答

3

我想你几乎已经有了它。在表达式的末尾添加$仅匹配字符串末尾出现== 0的那些字符串。

gsub("== 0$", "< 0.001", df$STRING) 

这假设== 0实际上只发生在最后(如你的例子)。如果它也出现在“中间串”中,则可以找到更复杂的表达式。不过,我认为清理这些字符串和使用"== 0$"是更清洁的解决方案。

编辑:

修改更复杂的字符串需要更复杂的表达式。按照更新后的问题,我能想到的最简单的解决方法是:

gsub("== 0(|$)", "< 0.001\\1", df$STRING) 

这假定每场比赛要么后面有一个空格或字符串的结尾。 ()是分组,\\1是对该组的反向引用。 @hwnd还有另一个解决方案的答案。

+0

这就是它!但是如果有'italic(R)^ 2 == 0'的情况并且我也希望它是'italic(R)^ 2 <0.001'?什么是更复杂的表达式? **注意**:我编辑我的示例以包含这些实例。 – Stefan

+0

即使这是对OP的评论的迟回复,我还是赞成了你的回答,但我在回答后仍然使用更新的解决方案编辑了答案。大多数用户不倾向于这样做。 – hwnd

+0

谢谢@SimonG!很好的答案! – Stefan

1

基于您的评论,你会需要修改你的正则表达式:

gsub('== 0(?=\\h|$)', '< 0.001', df$STRING, perl=TRUE) 

CodeBunk

+0

神圣烟,这是一口!我会坐下来尝试消化它。由于@SimonG回答了我最初的问题,并且在我的案例中对我很有帮助,所以我接受了他的回答,但同时也将你的投票通过了。感谢你! – Stefan

+0

当然,我还没有足够的声望来提高你的答案... – Stefan

+1

太棒了:D!谢谢@hwnd – Stefan