【问题标题】:Use strsplit starting at end of string从字符串末尾开始使用 strsplit
【发布时间】:2014-04-29 05:33:05
【问题描述】:

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

任何帮助将不胜感激!

【问题讨论】:

    标签: r strsplit


    【解决方案1】:

    您似乎对如何使用环视断言有些困惑。您正在使用的模式 "(?&lt;=.{4})" 是一个 look-behind 断言,它说“找到我所有的字符间空格,这些空格 前面 由任何类型的四个字符",这不是你真正想要的。

    您真正想要的模式"(?=.{4}$)" 是一个look-ahead 断言,它找到后跟 四个任意类型字符的单个字符间空间紧跟在字符串的末尾

    不幸的是,有一个令人不快的转折。由于this question 的答案中讨论的原因,strsplit() 与前瞻断言奇怪地交互;因此,您实际需要的模式是"(?&lt;=.)(?=.{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"
    

    【讨论】:

    • 感谢您的快速回答!这正是我一直在寻找的,而且效果很好。
    【解决方案2】:

    最后的子串不是更简单吗?

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

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

    【讨论】:

    • 感谢您的回答!如果我只想保留最后 4 个字符,这是一个很好的选择。但是当我试图用新标签替换开始标签并用最后 4 个字符重新绑定新标签时,拆分字符串而不是子集似乎是一个更简单的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 2017-02-08
    相关资源
    最近更新 更多