2017-10-10 78 views
2

我有一個名稱向量,其中一些名稱具有前導和尾隨.個字符,而另一些則沒有。這裏有一個例子:有條件地刪除R中前導或尾部的'.`字符

test <- c('.name.1.','name.2','.name.3.') 

我想有條件地刪除前導和這些名字尾隨.字符,使用substr函數返回

c('name.1','name.2','name.3') 

回答

7

使用正則表達式:

test <- c('.name.1.','name.2','.name.3.') 
gsub('^\\.|\\.$', '', test) 
# [1] "name.1" "name.2" "name.3" 

兩個反斜槓,\\,在正則表達式逃脫點,.,這實際上意味着任何字符。脫字號^標誌着字符串的開始,即美元,字符串的結尾。 |是邏輯「或」。所以實質上,正則表達式匹配字符串開頭的一個點或字符串末尾的一個點,並用空字符串替換它。

對正則表達式的更多信息,可以發現在GSUB和相關功能herehere和信息。

2

快速功能:

fun1 <- function(x) substr(x, 1 + (1 * as.numeric(substr(x,1,1)=='.')), nchar(x) - (1 * as.numeric(substr(x, nchar(x), nchar(x)) == '.'))) 

我們使用substr檢查字符串的第一個和最後一個元素中的.,然後我們使用substr再次提取文本的某些部分。例如,如果在第一個字符中有.,但在第二個字符中不存在,我們將提取:substr(text, 2, nchar(text))

fun1(test) 
[1] "name.1" "name.2" "name.3" 
2

您還可以使用str_extractstringr

library(stringr) 

str_extract(test, "\\w+\\.\\d") 

str_replace_allstringr換算到gsub):

str_replace_all(test, "[.](.+)[.]", "\\1") 

# [1] "name.1" "name.2" "name.3" 
2

只是爲了好玩,這裏是substringgrepl的方法。

substring(test, 1L + grepl("^\\.", test), nchar(test) - grepl("\\.$", test)) 
[1] "name.1" "name.2" "name.3" 

這將工作與substr更換substring。關於這些功能的很酷的事情是,它們爲第二和第三個參數提供了載體。在這裏,我們可以使用grepl爲第二個參數以及最終字符的位置和倒數第二個字符之間的1L和2L之間遞增。

相關問題