根据两种不同的条件拆分一列字符串(具有不同的模式)

Split a column of strings (with different patterns) based on two different conditions

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

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

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

strsplit(data$string, "-")

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

strsplit(data$string, "x_")

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

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

这是一个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"))