2014-02-10 34 views
4

內刪除角色,我有一個字符串矢量:從向量元素

str.vect<-c ("abcR.1", "abcL.1", "abcR.2", "abcL.2")

str.vect 
[1] "abcR.1" "abcL.1" "abcR.2" "abcL.2" 

如何從每個向量元素的權利刪除第三個字符?

這裏是理想的結果:

"abc.1" "abc.1" "abc.2" "abc.2"

非常感謝你提前

回答

9

您可以使用nchar找到矢量

> nchar(str.vect) 
[1] 6 6 6 6 

的每個元素的長度然後你將它與strtrim結合起來得到每個字符串的開頭

> strtrim(str.vect, nchar(str.vect)-3) 
[1] "abc" "abc" "abc" "abc" 

得到了這個詞的結尾,那麼你可以使用substr(實際上,你可以使用substr拿到開始太...)

> substr(str.vect, nchar(str.vect)-1, nchar(str.vect)) 
[1] ".1" ".1" ".2" ".2" 

最後使用paste0(這是pastesep="")粘在一起

> paste0(strtrim(str.vect, nchar(str.vect)-3), # Beginning 
     substr(str.vect, nchar(str.vect)-1, nchar(str.vect))) # End 
[1] "abc.1" "abc.1" "abc.2" "abc.2" 

有,如果你知道你的字符串有一些特殊的特徵更容易的方法

例如,如果長度始終爲6,則可以直接將nchar調用替換爲適當的值。


編輯:另外,R還支持正則表達式,從而使這一任務變得更加簡單。

> gsub(".(..)$", "\\1", str.vect) 
[1] "abc.1" "abc.1" "abc.2" "abc.2" 

語法有點晦澀難懂,但一旦你知道你在看什麼就沒那麼困難。

第一個參數(".(..)$")是要匹配

.匹配任何字符是什麼,$表示字符串的結尾。 所以...$表示字符串中的最後3個字符。

我們把最後兩個放在括號中,以便我們可以將它們存儲在內存中。

第二個參數告訴我們你想用什麼替代匹配的子字符串。在我們的例子中,我們把\\1這意味着「無論在第一對括號中」。

所以基本上這個命令的意思是:「找到字符串中的最後三個字符,並用最後兩個字符改變它們」。

+0

非常感謝, nico!這是一個絕妙的解決方案!剛開始學習正則表達式,似乎有點複雜。 – DSSS

3
str.vect<-c ("abcR.1", "abcL.1", "abcR.2", "abcL.2") 

a <- strsplit(str.vect,split="") 

a <- strsplit(str.vect,split="") 
b <- unlist(lapply(a,FUN=function(x) {x[4] <- "" 
          paste(x,collapse="")} 
         )) 

如果你想參數化它進一步改變4到一個變量,並把你想要刪除的字符的索引。

5

由@nico提供的解決方案似乎很好,但更簡單的替代方法可能是使用sub:通過任何2「的任何字符(由.表示)如下:

sub('.(.{2})$', '\\1', str.vect) 

此搜索的圖案字符(由.{2}表示),隨後是字符串的結尾(由$表示)「。通過將.{2}包括在括號內,R捕獲最後兩個字符所包含的內容。第二個參數是用來替換匹配的子串的字符串。在這種情況下,我們引用匹配模式中捕獲的第一個字符串。這由\\1表示。 (如果捕獲了模式的多個部分,並帶有多組括號,則可以參考隨後捕獲的區域,例如\\2,\\3等)。

+0

非常感謝Avinash和jbaums的幫助和明確的解釋。 – DSSS

1

不確定這是多麼一般或高效,但它似乎你的榜樣字符串工作:

(雖然我沒有使用strtrim功能這似乎非常相似,尼科的答案。)

my.string <- c("abcR.1", "abcL.1", "abcR.2", "abcL.2") 

n.char <- nchar(my.string) 
the.beginning <- substr(my.string, n.char-(n.char-1), n.char-3) 
the.end <- substr(my.string, n.char-1, n.char) 

new.string <- paste0(the.beginning, the.end) 
new.string 

# [1] "abc.1" "abc.1" "abc.2" "abc.2" 
0

從每個元素右側的第三個字符被刪除。

sapply(str.vec, function(x) gsub(substr(x, nchar(x)-2,nchar(x)-2), "", x))