从矢量元素中删除字符

时间:2014-02-10 06:49:44

标签: r

我有一个字符串向量:

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"

非常感谢您提前

6 个答案:

答案 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"

最后你使用paste0pastesep="")将它们粘在一起

> 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"