2016-11-22 27 views
2

比方說,我想將字符串X0_Y1_Z2更改爲X0_Y1_Z1,即將最後一個數字減1。我想它在R上下面的語句,這不起作用:如何在R中使用sub中的數字操作?

sub("(\\S+_\\S+_)\\S(\\d)", paste0("\\1", as.numeric("\\2")-1), "X0_Y1_Z2", perl=T) 

我該怎麼辦呢?

+0

它可以是「X0_Y1_Z222」嗎?你還需要驗證字符串(你的模式似乎需要特定的模式)? –

回答

2

如果你總是有這相同的格式的字符串,你只有1個最後一個數字遞減,使用簡單substring

> paste0(substring(s, 1, nchar(s)-1), as.numeric(substring(s, nchar(s))) - 1) 
> [1] "X0_Y1_Z1" 

爲了匹配字符串中的最後一位數塊,用[0-9]+$正則表達式。要增加該值,請使用gsubfn包。看一個例子代碼:

> library(gsubfn) 
> s <- "X0_Y1_Z2" 
> gsubfn('[0-9]+$', ~ as.numeric(x)-1, s) 
[1] "X0_Y1_Z1" 

如果您需要驗證字符串中,你做的方式,使用更多的團體和錨^$需要整個字符串匹配的模式(「全字符串匹配」) :

> p <- "^(\\S+_\\S+_\\S)(\\d+)$" 
> gsubfn(p, function(x1,x2) paste0(x1, as.numeric(x2)-1), s) 
[1] "X0_Y1_Z1" 
+1

謝謝! gsubfn軟件包似乎有訣竅。我會用它。 – CodingButStillAlive