从字符串末尾开始使用strsplit

时间:2014-03-21 17:35:51

标签: r strsplit

我目前使用代码拆分单个样本的名称,更改部分样本名称,然后将字符串重新绑定在一起。当所有名称长度相同时( ie:名称长度为8个字符并且它总是在前4个字符之后拆分),代码运行良好,但是当名称长度不同时,代码不再有效。

基本上,个人名称是7或8个字符。最后4个字符是重要的。
8个字符的示例:Samp003A
7个字符的示例:Sam003A

有没有办法继续使用strsplit来分隔我的名字,但从字符串的结尾开始,而不是从头开始,保留最后4个字符(003A)?

当前代码:

> RowList <- as.list(rownames(df1))    
> RowListRes <- strsplit(as.character(RowList), "(?<=.{4})", perl = TRUE)    
> RowListRes.df <- do.call(rbind, RowListRes)    
> RowListRes.df[,1] <- "LY3D"    
> dfnames <- apply(RowListRes.df, 1, paste, collapse="")    
> rownames(df1) <- dfnames    

第2行,我正在努力编辑,以便我可以根据最后4个字符进行拆分。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:3)

看起来你对如何使用外观断言有点混淆。您正在使用的模式"(?<=.{4})"是一个后视断言,其中说“找到我所有之前的之间的字符间空格由四个字符组成任何一种“,这不是你真正想要的。

您实际需要的模式"(?=.{4}$)"是一个预见断言,可以找到跟随的单个字符间空格四个字符任何后跟字符串结尾

不幸的是,有一种不愉快的转折。由于this question的答案中讨论的原因,strsplit()奇怪地与前瞻断言相互作用;因此,您实际需要的模式是"(?<=.)(?=.{4}$)"。这就是行动中的样子:

x <- c("Samp003A", "Sam003A")
strsplit(x, split="(?<=.)(?=.{4}$)", perl=T)
# [[1]]
# [1] "Samp" "003A"
# 
# [[2]]
# [1] "Sam"  "003A"

如果您真正想要的是每个条目的最后四个字符,可以使用substr(),如下所示:

x <- c("Samp003A", "Sam003A")
substr(x, start=nchar(x)-3, stop=nchar(x))
# [1] "003A" "003A"

答案 1 :(得分:1)

从最后来看,子串是不是更简单?

stringr::str_sub(as.character(RowList), -4)

stringr::str_sub(as.character(RowList), -4, -2)只获取数字?