2014-02-10 93 views
4

内删除角色,我有一个字符串矢量:从向量元素

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"

非常感谢你提前

回答

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(这是pastesep="")粘在一起

> 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这意味着“无论在第一对括号中”。

所以基本上这个命令的意思是:“找到字符串中的最后三个字符,并用最后两个字符改变它们”。

+0

非常感谢, nico!这是一个绝妙的解决方案!刚开始学习正则表达式,似乎有点复杂。 – DSSS

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到一个变量,并把你想要删除的字符的索引。

5

由@nico提供的解决方案似乎很好,但更简单的替代方法可能是使用sub:通过任何2“的任何字符(由.表示)如下:

sub('.(.{2})$', '\\1', str.vect) 

此搜索的图案字符(由.{2}表示),随后是字符串的结尾(由$表示)“。通过将.{2}包括在括号内,R捕获最后两个字符所包含的内容。第二个参数是用来替换匹配的子串的字符串。在这种情况下,我们引用匹配模式中捕获的第一个字符串。这由\\1表示。 (如果捕获了模式的多个部分,并带有多组括号,则可以参考随后捕获的区域,例如\\2,\\3等)。

+0

非常感谢Avinash和jbaums的帮助和明确的解释。 – DSSS

1

不确定这是多么一般或高效,但它似乎你的榜样字符串工作:

(虽然我没有使用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" 
0

从每个元素右侧的第三个字符被删除。

sapply(str.vec, function(x) gsub(substr(x, nchar(x)-2,nchar(x)-2), "", x))