内删除角色,我有一个字符串矢量:从向量元素
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"
非常感谢你提前
内删除角色,我有一个字符串矢量:从向量元素
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"
非常感谢你提前
您可以使用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
这意味着“无论在第一对括号中”。
所以基本上这个命令的意思是:“找到字符串中的最后三个字符,并用最后两个字符改变它们”。
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到一个变量,并把你想要删除的字符的索引。
由@nico提供的解决方案似乎很好,但更简单的替代方法可能是使用sub
:通过任何2“的任何字符(由.
表示)如下:
sub('.(.{2})$', '\\1', str.vect)
此搜索的图案字符(由.{2}
表示),随后是字符串的结尾(由$
表示)“。通过将.{2}
包括在括号内,R捕获最后两个字符所包含的内容。第二个参数是用来替换匹配的子串的字符串。在这种情况下,我们引用匹配模式中捕获的第一个字符串。这由\\1
表示。 (如果捕获了模式的多个部分,并带有多组括号,则可以参考随后捕获的区域,例如\\2
,\\3
等)。
非常感谢Avinash和jbaums的帮助和明确的解释。 – DSSS
不确定这是多么一般或高效,但它似乎你的榜样字符串工作:
(虽然我没有使用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"
从每个元素右侧的第三个字符被删除。
sapply(str.vec, function(x) gsub(substr(x, nchar(x)-2,nchar(x)-2), "", x))
非常感谢, nico!这是一个绝妙的解决方案!刚开始学习正则表达式,似乎有点复杂。 – DSSS