首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从向量元素中移除字符

从向量元素中移除字符
EN

Stack Overflow用户
提问于 2014-02-10 06:49:43
回答 6查看 15K关注 0票数 7

我有一个字符串向量:

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

代码语言:javascript
复制
 str.vect
[1] "abcR.1" "abcL.1" "abcR.2" "abcL.2"

如何从每个向量元素的右侧删除第三个字符?

以下是预期的结果:

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

先谢谢你

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-02-10 07:06:51

可以使用nchar查找向量的每个元素的长度。

代码语言:javascript
复制
> nchar(str.vect)
[1] 6 6 6 6

然后将其与strtrim组合起来,以获得每个字符串的开头。

代码语言:javascript
复制
> strtrim(str.vect, nchar(str.vect)-3)
[1] "abc" "abc" "abc" "abc"

为了得到单词的结尾,您可以使用substr (实际上,您也可以使用substr获得开头)。

代码语言:javascript
复制
> substr(str.vect, nchar(str.vect)-1, nchar(str.vect))
[1] ".1" ".1" ".2" ".2"

最后,使用paste0 (即pastesep="")将它们粘合在一起。

代码语言:javascript
复制
> 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也支持正则表达式,这使得这项任务更加容易。

代码语言:javascript
复制
> gsub(".(..)$", "\\1", str.vect)
[1] "abc.1" "abc.1" "abc.2" "abc.2"

语法有点模糊,但一旦你知道你在看什么,就不会那么难了。

第一个参数(".(..)$")是您想要匹配的

.匹配任何字符,$表示字符串的结尾。因此,...$表示字符串中的最后3个字符。

我们把最后两个放在括号中,这样我们就可以将它们存储在内存中。

第二个参数告诉我们要用什么替换匹配的子字符串。在我们的例子中,我们使用\\1,意思是“第一对括号中的任何内容”。

因此,从本质上讲,这个命令的意思是:“查找字符串中的最后三个字符,并用最后两个更改它们”。

票数 13
EN

Stack Overflow用户

发布于 2014-02-10 07:19:18

@nico提供的解决方案似乎不错,但更简单的选择可能是使用sub

代码语言:javascript
复制
sub('.(.{2})$', '\\1', str.vect)

这将搜索以下模式:“任何字符(由.表示),任何字符的2个(由.{2}表示),然后是字符串的末尾(由$表示)”。通过在括号中包装.{2},R可以捕获最后两个字符。第二个参数是要用匹配的子字符串替换字符串。在本例中,我们引用匹配模式中捕获的第一个字符串。这由\\1表示。(如果您捕获了模式的多个部分,并带有多组括号,则会引用后续捕获的区域,例如\\2\\3等)。

票数 8
EN

Stack Overflow用户

发布于 2014-02-10 07:18:01

代码语言:javascript
复制
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进一步更改为变量,并将要移除的字符的索引放在那里。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21670715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档