2012-08-13 24 views
178

我想從矢量中刪除字符串中的特定字符,類似於Excel中的查找和替換功能。在R中,替換字符串中的文本

這裏是我開始與數據:

group <- data.frame(c("12357e", "12575e", "197e18", "e18947") 

我開始只是第一列;我想通過刪除e的產生第二欄:

group  group.no.e 
12357e  12357 
12575e  12575 
197e18  19718 
e18947  18947 

回答

279

使用正則表達式和功能gsub()

group <- c("12357e", "12575e", "197e18", "e18947") 
group 
[1] "12357e" "12575e" "197e18" "e18947" 

gsub("e", "", group) 
[1] "12357" "12575" "19718" "18947" 

什麼gsub在這裏所做的是用一個取代的"e"每次出現空字符串""


?regexpgsub更多的幫助。

+8

'固定= TRUE'會使這個更快。 – 2016-03-17 03:18:56

+2

@RichScriven你能不能簡述一下爲什麼? – glaed 2016-09-23 10:56:09

+3

'fixed = TRUE'阻止R使用正則表達式,這允許更靈活的模式匹配,但需要時間進行計算。如果只需要刪除一個常量字符串「e」,則不需要。 – mm689 2016-10-31 19:16:11

36

正則表達式是您的朋友:

R> ## also adds missing ')' and sets column name 
R> group<-data.frame(group=c("12357e", "12575e", "197e18", "e18947")) ) 
R> group 
    group 
1 12357e 
2 12575e 
3 197e18 
4 e18947 

現在使用gsub()用盡可能簡單的替換模式:空字符串:

R> group$groupNoE <- gsub("e", "", group$group) 
R> group 
    group groupNoE 
1 12357e 12357 
2 12575e 12575 
3 197e18 19718 
4 e18947 18947 
R> 
+2

另外...'require(stringr); group $ groupNoE < - str_replace(group $ group,「e」,「」)' – dickoa 2012-08-13 14:37:40

+23

嗯,我可以嘲笑說:「那些不瞭解基本函數的人註定要替換它們。究竟stringr在這裏獲得了什麼,除了增加源文件中下劃線的數量呢? – 2012-08-13 14:39:15

+7

「** stringr是一組簡單的包裝,它使得R的字符串函數更加一致,更簡單,更易於使用**」。所以,如果你說的是真的(許多下劃線來包裝基本功能...)沒有理由這個軟件包存在(免責聲明:我主要使用基本的正則表達式函數,但我知道它們可能很難爲新用戶... ) – dickoa 2012-08-13 14:46:36

15

總結2種方式來替換字符串:

group<-data.frame(group=c("12357e", "12575e", "197e18", "e18947")) 

1)使用gsub

group$group.no.e <- gsub("e", "", group$group) 

2)使用stringr

group$group.no.e <- str_replace_all(group$group, "e", "") 

兩者都會產生慾望輸出:

group group.no.e 
1 12357e  12357 
2 12575e  12575 
3 197e18  19718 
4 e18947  18947 
+5

'gsub()'已經在其他兩個答案中提到過 – 2015-08-04 14:13:38

+2

當時你不得不閱讀整個頁面,包括註釋以學習stringr的語法,這是我的首選方法,因爲它大部分是在評論中討論的。這個解決方案很快呈現出兩種選擇,這就是我提供它的原因。我的希望是幫助其他用戶過濾很多,就像我剛剛接觸R時所做的一樣。在找到stringr之前,我苦於使用gsub *,因爲*它在高度優先的答案中沒有提及。再次,目標不是收集upvotes,而是嘗試幫助新的R用戶。 – Megatron 2017-01-09 12:46:48

+0

如果您發現其他答案/評論中的信息對您有用並且想要轉換爲答案,您至少可以提供一些信息來顯示您從哪裏獲取信息/將答案作爲Comminuty Wiki,而不僅僅是將其作爲參考作爲你自己的。 – 2017-01-09 13:14:11

2

使用stringi包:

require(stringi) 

group<-data.frame(c("12357e", "12575e", "197e18", "e18947")) 
stri_replace_all(group[,1], "", fixed="e") 
[1] "12357" "12575" "19718" "18947" 
4

你並不需要從矢量創建數據幀字符串,如果你想替換它中的一些字符。正則表達式是不錯的選擇,因爲它已被@Andrie和@Dirk Eddelbuettel提及。

注意的是,如果你要替換的特殊字符,如點,你應該使用完整的正則表達式語法,如下面的例子中:

ctr_names <- c("Czech.Republic","New.Zealand","Great.Britain") 
gsub("[.]", " ", ctr_names) 

這將產生

[1] "Czech Republic" "New Zealand" "Great Britain"