【问题标题】:Split a column of strings (with different patterns) based on two different conditions根据两个不同的条件拆分一列字符串(具有不同的模式)
【发布时间】:2022-01-02 09:02:57
【问题描述】:

希望能在这个问题上得到一些帮助。所以我有一列包含两种类型的字符串,我需要使用 2 个不同的条件将字符串拆分为多列。我可以弄清楚如何单独拆分它们,但很难在我的代码中添加一个 IF 语句。这是下面的示例数据集:

data = data.frame(string=c("HFUFN-087836_661", "207465-125 - IK_6 Mar 2009.docx_37484956"))

对于第一种类型的变量(带有_)。我想在_之后拆分。所以我为此使用了以下代码

strsplit(data$string, "-")

对于其中包含 .docx 的变量,我想在 docx 之后拆分。我不能根据“_”进行拆分,因为它在这个字符串中多次出现。所以我使用了以下代码:

strsplit(data$string, "x_")

我的问题是这两种类型的字符串都出现在同一列中。有没有办法告诉R“docx”是否在字符串中,然后在x_之后拆分,但如果它没有在_上拆分?

任何帮助将不胜感激 - 谢谢你们!

【问题讨论】:

    标签: r string data-manipulation strsplit


    【解决方案1】:

    这是tidyr 解决方案:

    library(tidyr)
    data %>%
    extract(string,
            into = c("1","2"),    # choose your own column labels
            "(.*?)_([^_]+)$")
                                    1        2
    1                    HFUFN-087836      661
    2 207465-125 - IK_6 Mar 2009.docx 37484956
    

    正则表达式的工作原理

    正则表达式将字符串分成两个“捕获组”加上中间的下划线:

    • (.*?):第一个捕获组,匹配任意字符 (.) 零次或多次 (*) 非贪婪 (?)
    • _:文字下划线
    • ([^_]+)$:第二个捕获组,匹配字符串末尾 ($) 一次或多次 (+) 的任何下划线 ([^_]) 字符

    数据:

    data = data.frame(string=c("HFUFN-087836_661", "207465-125 - IK_6 Mar 2009.docx_37484956"))
    

    【讨论】:

    • 嘿,这有效 - 非常感谢。如果它不是太多的工作,你能解释一下你是怎么做到的吗?我不太明白这部分:“”(.*?)_([^_]+)$")”。非常感谢!
    • 已经解释了正则表达式部分的工作原理
    猜你喜欢
    • 2020-09-25
    • 2018-05-27
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多