在R

时间:2015-11-17 22:37:10

标签: r replace

在以下示例中,如何在italic(P) == 0 italic(P) < 0.001时替换这些实例?

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)弹出窗口中手动更改它,但这不是一个好习惯。

2 个答案:

答案 0 :(得分:3)

我觉得你差不多了。将$放在表达式的末尾只匹配字符串末尾出现== 0的字符串。

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

这假设== 0实际上仅在结尾处发生(如在您的示例中)。如果它也出现在“mid-string”中,则可以找到更复杂的表达式。但是,我认为清理这些字符串并使用"== 0$"是更清晰的解决方案。

编辑:

对更复杂的字符串进行修改需要更复杂的表达式。根据您更新的问题,我能想到的最简单的解决方案是:

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

这假设每个匹配后跟一个空格或字符串的结尾。 ()是一个分组,\\1是对该群组的反向引用。另请参阅@hwnd提供另一种解决方案的答案。

答案 1 :(得分:2)

根据您的评论,您需要修改正则表达式:

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

CodeBunk