首页 > 解决方案 > 数据整理帮助:用所有数据拆分一列

问题描述

我需要一些数据整理方面的帮助。我在 Facebook Messenger 上下载了与某人的对话,但它的输出如下:

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  

它们都在一个列中,但我正在尝试制作一个数据框,其中说话者在一个列中,消息在另一个列中,日期将在另一个列中。我面临的问题是,有时消息分两行,所以我不能将整列分成三列。什么是最好的解决方案?感谢任何帮助:)

标签: r

解决方案


由于您的条目始终是“人 A”(或人 B)并以日期结尾,格式为 YYYY-MM-DD HH:MM,我会使用这样的正则表达式:

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|^)Person A\s*\n([\s\S]*?)\n

  • (?<=\n|^)正在查找前面有一个空格或文档开头的内容,以防您在聊天中使用“人员 A”一词。
  • Person A\\s*\n: 查找后跟空格(至少为 0)和换行符的名称
  • ([\\s\\S]*?): 提取包括换行符在内的所有内容
  • \n:在换行之前停止提取

推荐阅读