2012-03-09 120 views
0

幾個月前,我結束了一個子語句,最初與我的輸入數據一起工作。它已經停止工作,使我重新審視我的醜陋過程。我不想分享它,但它同時完成幾件事情:替換和不匹配'sub'

active$id[grep("CIR",active$description)] <- sub(".*CIR0*(\\d+).*","\\1",active$description[grep("CIR",active$description)],perl=TRUE) 

此語句發現了嵌入在說明欄的ID行創建了一個新的ID列。子語句會查找「CIR0」後面的數字,並填充id列,如果在行描述中存在id的話。我認識到,在任務的任何一方嵌入grep子集都是低效的。

如果模式不匹配,有一種方法可以讓'sub'替換爲NA或爲空嗎?我覺得我錯過了一些東西非常簡單但要求社區的幫助。謝謝。

實例與創建一個id列結果:

| name | id | description  | 
|------+-----+-------------------| 
| a | 343 | Here is CIR00343 | 
| b |  | Didn't have it | 
| c | 123 | What is CIR| 
| d |  | CIR lacks a digit | 
| e | 452 | CIR452 is next | 
+2

如果你給出一些樣本數據並輸出,這將是很好的!這樣我們可以驗證你需要什麼。 – nograpes 2012-03-09 21:12:57

+0

我相信自己這個問題已經足夠普遍,以至於樣本數據可能會更混亂,但您說得對 - 我添加了一個簡短的表格。 – jed 2012-03-09 21:49:50

回答

1

幾周前我在同一個問題上掙扎。我最終使用了stringr包中的str_match函數。如果沒有找到目標字符串,它將返回NA。只要確保你正確地分組結果。舉個例子:

library(stringr) 
str = "Little_Red_Riding_Hood" 
sub(".*(Little).*","\\1",str) # Returns 'Little' 
sub(".*(Big).*","\\1",str) # Returns 'Little_Red_Riding_Hood' 
str_match(str,".*(Little).*")[1,2] #Returns 'Little' 
str_match(str,".*(Big).*")[1,2] # Returns NA 
+0

感謝您向我介紹stringr軟件包。使用它我已經能夠清理流程並捕獲我沒有預料到的副案例。 – jed 2012-03-09 23:11:12

0

我覺得在這種情況下,你可以嘗試使用ifelse(),即

active$id[grep("CIR",active$description)] <- ifelse(match, replacement, "") 

其中match應該評估爲true,如果有一個匹配,並且replacement是在那種情況下將被替換的元素。同樣,如果match的計算結果爲false,則將該元素替換爲空字符串(如果您願意,也可以使用NA)。

+0

聲明:我還沒有在R中使用grep/regex功能,所以這可能不是最好的解決方案,但我只是把它扔在那裏 - 「ifelse()'已經在很多方面拯救了我的背後我已經失去了數量。 – 2012-03-09 21:21:57

+0

謝謝,在這種情況下,我沒有考慮過ifelse(),但試圖找出一種方法在您的答案後利用它。我很難從測試中捕獲這種模式,而無需重複這個過程作爲替換的一部分。我會再考慮一下。 – jed 2012-03-09 23:17:14