2

我目前一直在使用代码来拆分单个样本的名称,更改部分样本名称,然后将字符串重新绑定在一起。该代码在所有名称长度相同时运行良好(即:名称长度为 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 个字符进行拆分。

任何帮助将不胜感激!

4

2 回答 2

3

看起来您对如何使用环视断言有点混淆。您使用的模式"(?<=.{4})", 是一个后向断言,它说“找到我所有前面有四个字符的字符间空格”,这不是您真正想要的。

您真正想要的模式"(?=.{4}$)", 是一个前瞻断言,它查找单个字符间空间,该空间后跟四个任意类型的字符,然后是字符串的结尾

不幸的是,有一个令人不快的转折。由于这个问题的答案中讨论的原因,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"
于 2014-03-21T17:42:34.323 回答
1

最后的子字符串不会更简单吗?

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

还是stringr::str_sub(as.character(RowList), -4, -2)只得到数字?

于 2014-03-21T17:38:59.267 回答