我有一个字符串向量:
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"
非常感谢您提前
答案 0 :(得分: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
(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
表示&#34;第一对括号中的任何内容&#34;。
所以基本上这个命令意味着:&#34;找到字符串中的最后三个字符并用最后两个字符更改它们&#34;。
答案 1 :(得分:5)
@nico提供的解决方案似乎很好,但更简单的替代方案可能是使用sub
:
sub('.(.{2})$', '\\1', str.vect)
这将搜索以下模式:“任何字符(由.
表示)后跟2个任意字符(由.{2}
表示),后跟字符串的结尾(由{{表示) 1}})”。通过将$
包装在括号中,R捕获最后两个字符所包含的内容。第二个参数是用匹配的子串替换的字符串。在这种情况下,我们引用匹配模式中捕获的第一个字符串。这由.{2}
表示。 (如果您使用多组括号捕获了模式的多个部分,则可以引用后续捕获的区域,例如\\1
,\\2
等。
答案 2 :(得分: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更改为变量,并将要删除的字符的索引放在那里。
答案 3 :(得分:1)
不确定这是多么普遍或有效,但它似乎适用于您的示例字符串:
(虽然我没有使用strtrim
功能,但这似乎与nico的回答非常相似。)
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"
答案 4 :(得分:0)
删除每个元素右侧的第3个字符。
sapply(str.vec, function(x) gsub(substr(x, nchar(x)-2,nchar(x)-2), "", x))
答案 5 :(得分:0)
这是一个非常快速和肮脏的答案,但这有时是需要的:
#Define vector
str.vect <- c("abcR.1", "abcL.1", "abcR.2", "abcL.2")
#Use gsub to remove both 'R' and 'L' independently.
str.vect2 <- gsub("R", '', str.vect )
str.vect_final <- gsub("L", '', str.vect2 )
>str.vect_final
[1] "abc.1" "abc.1" "abc.2" "abc.2"