2015-11-17 55 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