Справка по уборке данных: разделение одного столбца со всеми данными - PullRequest
0 голосов
/ 26 июня 2018

Мне нужна помощь с приведением данных в порядок. Я скачал свой разговор с кем-то в мессенджере Facebook, но его вывод выглядит примерно так:

V1.  
Person A  
Coolcool  
2018-06-25 19:34  
Person B  
See you later  
:D  
2018-06-25 19:34  
Person A  
You called Person B   
Duration: 30 seconds   
2018-06-25 19:19  
Person B.  
What's up?   
2018-06-25 19:09  
Person A   
Hey!   
2018-06-25 19:09  

Они все в одном столбце, но я пытаюсь создать фрейм данных, в котором говорящий находится в одном столбце, сообщение - в другом, а дата - в другом. Проблема, с которой я сталкиваюсь, заключается в том, что иногда сообщение состоит из двух строк, поэтому я не могу просто разбить весь столбец на три столбца. Каково было бы лучшее решение для этого? Цени любую помощь с этим:)

1 Ответ

0 голосов
/ 26 июня 2018

Поскольку ваши записи всегда "Лицо А" (или Лицо Б) и оканчиваются датой, в формате ГГГГ-ММ-ДД ЧЧ: ММ, я бы использовал регулярное выражение, например:

library(stringr)
date_match="\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}"
col_a=str_match_all(chat_messenger,
                    paste0("(?<=\n|^)Person A\\s*\n([\\s\\S]*?)\n",date_match, sep="")
                    )[[1]][,2]
col_b=str_match_all(chat_messenger,
                    paste0("(?<=\n)Person B\\s*\n([\\s\\S]*?)\n",date_match, sep="")
)[[1]][,2]
col_a
col_b

Что дает в результате:

> col_a
[1] "Coolcool  "                                      "You called Person B   \nDuration: 30 seconds   "
[3] "Hey!   "                                        
> col_b
[1] "See you later  \n:D  " ".  \nWhat's up?   "   

Для лучшего понимания соответствия регулярному выражению: Я разделю эту строку: (? <= \ n | ^) Персона A \ s * \ n ([\ s \ S] *?) \ n </p>

  • (?<=\n|^) ищет что-то, чему предшествует пробел или начало документа на случай, если вы будете использовать слова «Персона А» в чате.
  • Person A\\s*\n: ищет имя, за которым следуют пробел (не менее 0) и разрыв строки
  • ([\\s\\S]*?): извлечение всего, включая разрывы строк
  • \n: остановить извлечение до разрыва строки
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...