用R拆分非常复杂的字符串

用R拆分非常复杂的字符串,r,string-split,R,String Split,我有50000行两人之间的对话,其中一行是典型的对话 会话 2014/07/06,10:40:42下午:弗朗西斯©我会把我的学生证留给他 我想分割每一行,这样我就可以得到一个包含以下变量的数据框:Date;时间人物和信息。 我希望能够做到这一点,使用R没有Excel,然后我会进行情绪分析 有人能帮我做这件事吗?有人喜欢这件工作吗 > string <- "2014/07/06, 10:40:42 PM: Franckess ©: I'll leave my student

我有50000行两人之间的对话,其中一行是典型的对话 会话 2014/07/06,10:40:42下午:弗朗西斯©我会把我的学生证留给他 我想分割每一行,这样我就可以得到一个包含以下变量的数据框:Date;时间人物和信息。 我希望能够做到这一点,使用R没有Excel,然后我会进行情绪分析


有人能帮我做这件事吗?

有人喜欢这件工作吗

> string <- 
     "2014/07/06, 10:40:42 PM: Franckess ©: I'll leave my student card with him"
> s <- strsplit(string, "(, )|(: )|( [[:print:]]: )")[[1]]
> names(s) <- c("Date", "Time", "Person", "Message")
> data.frame(as.list(s))
#         Date        Time    Person                             Message
# 1 2014/07/06 10:40:42 PM Franckess I'll leave my student card with him

在解析结构化字符串时,我喜欢使用正则表达式捕获部分匹配项,然后使用辅助函数提取这些匹配项。比如说

msg<-c("2014/07/06, 10:40:42 PM: Franckess ©: I'll leave my student card with him", "2014/07/06, 10:38:34 PM: Viv M.: I can just fetch it from him")

m<-regexpr("([\\d/]+), ([\\d: AMP]+): (.*): (.*)$",msg, perl=T)

dd<-data.frame(do.call(rbind, regcapturedmatches(msg, m)))

names(dd)<-c("Date","Time","Person","Message")
你也可以这样做:

  library(stringr)
  str1 <- c("2014/07/06, 10:40:42 PM: Franckess ©: I'll leave my student card with him", "2014/07/06, 10:38:34 PM: Viv M.: I can just fetch it from him")

  str2 <- str_replace_all(str1, perl(':(?= )'),",") 
使现代化 您还可以使用:

  read.csv(text=str2, sep=",",header=F,stringsAsFactors=F)
 #          V1           V2           V3                                   V4
 #1 2014/07/06  10:40:42 PM  Franckess ©  I'll leave my student card with him
 #2 2014/07/06  10:38:34 PM       Viv M.         I can just fetch it from him

数据的来源是什么?你能分享多行吗?它们都有相同的通用模式吗?你可以使用strsplit,第一个包含日期,第二个包含时间,第三个包含pm:第四个名称第五个©剩下的对话我的数据源是Whatsapp对话。这些线条都有相似的图案。这里还有一个:2014/07/06,10:38:34 PM:Viv M:我可以从him@phonixor我不确定会跟你走!我试图阅读strsplit的帮助文件,但还没有弄明白:PI建议删除[[1]]并显示do.callrbind。。。对于strsplit的结果。他们是否只想拆分这个字符串是值得怀疑的。但是+1:-即将发布类似的内容。Brilliant@AnandaMahto:dupped包含了这个字符串,以及一个可能有用的修改后的正则表达式。这是一个c表示版权,但实际上并不需要它@Frankess,我刚刚用一个简洁的代码更新了代码。谢谢@akrun为我多跑了一英里。我对文本进行情感分析,结果看起来不错:D
   setNames(as.data.frame(do.call(rbind, str_split(str2, ", ")), stringsAsFactors=F), c("Date", "Time", "Person", "Message")) # split based on `, `
  #       Date        Time      Person                             Message
 #1 2014/07/06 10:40:42 PM Franckess © I'll leave my student card with him
 #2 2014/07/06 10:38:34 PM      Viv M.        I can just fetch it from him
  read.csv(text=str2, sep=",",header=F,stringsAsFactors=F)
 #          V1           V2           V3                                   V4
 #1 2014/07/06  10:40:42 PM  Franckess ©  I'll leave my student card with him
 #2 2014/07/06  10:38:34 PM       Viv M.         I can just fetch it from him