內刪除角色,我有一個字符串矢量:從向量元素
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"
非常感謝你提前
內刪除角色,我有一個字符串矢量:從向量元素
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"
非常感謝你提前
您可以使用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
(這是paste
與sep=""
)粘在一起
> 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
這意味着「無論在第一對括號中」。
所以基本上這個命令的意思是:「找到字符串中的最後三個字符,並用最後兩個字符改變它們」。
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到一個變量,並把你想要刪除的字符的索引。
由@nico提供的解決方案似乎很好,但更簡單的替代方法可能是使用sub
:通過任何2「的任何字符(由.
表示)如下:
sub('.(.{2})$', '\\1', str.vect)
此搜索的圖案字符(由.{2}
表示),隨後是字符串的結尾(由$
表示)「。通過將.{2}
包括在括號內,R捕獲最後兩個字符所包含的內容。第二個參數是用來替換匹配的子串的字符串。在這種情況下,我們引用匹配模式中捕獲的第一個字符串。這由\\1
表示。 (如果捕獲了模式的多個部分,並帶有多組括號,則可以參考隨後捕獲的區域,例如\\2
,\\3
等)。
非常感謝Avinash和jbaums的幫助和明確的解釋。 – DSSS
不確定這是多麼一般或高效,但它似乎你的榜樣字符串工作:
(雖然我沒有使用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"
從每個元素右側的第三個字符被刪除。
sapply(str.vec, function(x) gsub(substr(x, nchar(x)-2,nchar(x)-2), "", x))
非常感謝, nico!這是一個絕妙的解決方案!剛開始學習正則表達式,似乎有點複雜。 – DSSS