我目前使用代码拆分单个样本的名称,更改部分样本名称,然后将字符串重新绑定在一起。当所有名称长度相同时( 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个字符进行拆分。
非常感谢任何帮助!
答案 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)
只获取数字?