Разделите столбец строк (с разными шаблонами) на основе двух разных условий

#r #string #data-manipulation #strsplit

Вопрос:

Надеялся получить некоторую помощь в решении этой проблемы. Итак, у меня есть столбец с двумя типами строк, и мне нужно будет разделить строки на несколько столбцов, используя 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_, но если он не разделяется на _?

Любая помощь будет признательна — Спасибо вам, ребята!

Ответ №1:

Вот tidyr решение:

 library(tidyr) data %gt;% 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"))  

Комментарии:

1. Эй, это сработало — большое тебе спасибо. Если это не слишком большая работа, не могли бы вы, пожалуйста, объяснить, как вы это сделали? Я не совсем понимаю эту часть: «»(.*?)_([^_] )$»)». Большое спасибо!

2. Предоставили объяснение того, как работает эта часть регулярных выражений