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

Posted

技术标签:

【中文标题】根据两个不同的条件拆分一列字符串(具有不同的模式)【英文标题】: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_之后拆分,但如果它没有在_上拆分?

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

【问题讨论】:

【参考方案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"))

【讨论】:

嘿,这有效 - 非常感谢。如果它不是太多的工作,你能解释一下你是怎么做到的吗?我不太明白这部分:“”(.*?)_([^_]+)$")”。非常感谢! 已经解释了正则表达式部分的工作原理

以上是关于根据两个不同的条件拆分一列字符串(具有不同的模式)的主要内容,如果未能解决你的问题,请参考以下文章

根据字符串的不同模式拆分字符串[重复]

如何根据不同的 WHERE 选择一列并生成两个不同的列

R拆分由不同数量的空格分隔的一列字符

Python拆分具有公制和英制单位的列

如何将数据集拆分为两个具有唯一和重复行的数据集?

如何将数据集拆分为两个具有唯一和重复行的数据集?