2011-09-28 53 views
0

我想從4行數據中分離字符串「24 !! 07 !! 10」,「15 !! 08 !! 12」和「10 !! 08 !! 12」下面。g中的agrep函數

> z 
                  LEGAL 
1              MAP #1166 
2      SE1/4 NE1/4 24!!07!!10 EX MAP #106 42.13 
3      MAP 15!!08!!12 N1/2NW1/4 15!!8!!12 80.00 AC 
4 BEG NW COR SAID SEC THEN E208' 10!!08!!12 NW1/4 EX TR AC 158.65~ 

首先,沒有max.distance選項,agrep函數根本找不到任何匹配。其次,選項value = TRUE似乎沒有給出模式匹配的實際值,如果輸出確實是行的索引,那麼第一行根本不應該是匹配的。

> pattern <-"[0-99]-[0-99]-[0-99]" 
> z1<-agrep(pattern ,z,ignore.case=TRUE, value=TRUE) 
> z1 
character(0) 

> z1<-agrep(pattern,z,ignore.case=TRUE, value=TRUE, max.distance=22) 
> z1 
[1] "c(2, 4, 3, 1)" 

我很感激任何幫助,弄清楚發生了什麼事情。

+1

你的問題幾乎是不可讀如何它最初是格式化的。如果我介紹了您不想要的任何內容,請隨時將其回滾。但請注意可用的代碼格式工具。 – joran

回答

1

不知道R,但是你的模式可能不正確。

怎麼樣"\d{2}!!\d{2}!!\d{2}"

"[0-9][0-9]!![0-9][0-9]!![0-9][0-9]" 

2

@Kent是正確的關於你的正則表達式不符合你所描述的模式。另外,agrep用於語言意義上的模糊匹配,並且不採用正則表達式。您正在尋找grep或那個家族的東西,可能是regexpr

鑑於你的數據

z <- c("MAP #1166", 
"SE1/4 NE1/4 24!!07!!10 EX  MAP #106 42.13", 
"MAP 15!!08!!12 N1/2NW1/4 15!!8!!12 80.00 AC", 
"BEG NW COR SAID SEC THEN E208' 10!!08!!12 NW1/4 EX TR AC 158.65~") 

您可以找到匹配的位置,如果你想使用正則表達式的其他形式的,你可以用

pattern <- "[0-9][0-9]!![0-9][0-9]!![0-9][0-9]" 
locs <- regexpr(pattern, z) 
substr(z, locs, locs+attr(locs,"match.length")-1) 

提取它們。你只需要在字符串文字中加雙轉義反斜槓即可。

pattern <- "\\d{2}!!\\d{2}!!\\d{2}" 
+0

謝謝! loc和substr與as.matrix函數結合使用,因爲我有10,000行奇數行數據。 – user969524

+1

我可能是一個討厭的人,指出'agrep'的幫助文件說「非空字符串或包含正則表達式的字符串」@Brian – Rico

+0

@Rico,在我的辯護中,這個改變被引入到r - 2011年8月25日發佈,僅在我回答前一個月左右。這一點不是穩定版本的一部分。 https://github.com/wch/r-source/commit/d2b80bd76b0433a314897bb4634ee5ca63f2418f這就是說,你說得對,那部分答案是過時的。 –

1

在R中懷疑agrep不支持這種模式。無論如何,你應該使用grep代替:

z1 <- grep("\\d{2}!!\\d{2}!!\\d{2}", z, value=TRUE) 
1

另一種解決方案是使用嘗試stringr包

require(stringr) 

pattern <- "\\d{2}!!\\d{2}!!\\d{2}" 
str_extract_all(z, pattern) 

,你會得到這樣的:

[[1]] 
character(0) 

[[2]] 
[1] "24!!07!!10" 

[[3]] 
[1] "15!!08!!12" 

[[4]] 
[1] "10!!08!!12"