我有一个字符串向量:
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"
先谢谢你
发布于 2014-02-10 07:06:51
可以使用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,意思是“第一对括号中的任何内容”。
因此,从本质上讲,这个命令的意思是:“查找字符串中的最后三个字符,并用最后两个更改它们”。
发布于 2014-02-10 07:19:18
@nico提供的解决方案似乎不错,但更简单的选择可能是使用sub
sub('.(.{2})$', '\\1', str.vect)这将搜索以下模式:“任何字符(由.表示),任何字符的2个(由.{2}表示),然后是字符串的末尾(由$表示)”。通过在括号中包装.{2},R可以捕获最后两个字符。第二个参数是要用匹配的子字符串替换字符串。在本例中,我们引用匹配模式中捕获的第一个字符串。这由\\1表示。(如果您捕获了模式的多个部分,并带有多组括号,则会引用后续捕获的区域,例如\\2、\\3等)。
发布于 2014-02-10 07:18:01
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进一步更改为变量,并将要移除的字符的索引放在那里。
https://stackoverflow.com/questions/21670715
复制相似问题