根据两个不同的条件拆分一列字符串(具有不同的模式)
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"))
【讨论】:
嘿,这有效 - 非常感谢。如果它不是太多的工作,你能解释一下你是怎么做到的吗?我不太明白这部分:“”(.*?)_([^_]+)$")”。非常感谢! 已经解释了正则表达式部分的工作原理以上是关于根据两个不同的条件拆分一列字符串(具有不同的模式)的主要内容,如果未能解决你的问题,请参考以下文章