清理数据-在数据框中将一列扩展为多列

时间:2020-05-22 05:02:50

标签: r tidyverse tidyr stringr tidy

下面的textsample位于一栏中。我希望使用R将其分为5列,并带有以下标题:“ Name”,“ Location”,“ Date”,“ Time”,“ Warning”。我已经尝试过separate()strsplit(),但还没有成功。我希望这里有人可以提供帮助。

textsample <- "Name : York-APC-UPS\r\n
    Location : York SCATS Zigzag Road\r\n
    Contact  : Mechanical  services\r\n
    \r\n
    http://York-APC-UPS.domain25.minortracks.wa.gov.au\r\n
    http://192.168.70.56\r\n
    http://FE81::3C0:B8FF:FE6D:8065\r\n
    Serial Number : 5A1149T24253\r\n
    Device Serial Number : 5A1149T24253\r\n
    Date : 12/06/2018\r\n
    Time : 08:45:46\r\n
    Code : 0x0125\r\n
    \r\n
    Warning : A high humidity threshold violation exists for integrated Environmental Monitor TH Sensor 
   (Port 1 Temp 1 at Port 1) reporting over 50%CD.\r\n"

1 个答案:

答案 0 :(得分:0)

这是一种至少应该帮助您入门的方法:

我们可以使用extract中的tidyr提取带有正则表达式的感兴趣的文本。

然后,我们可以使用mutate_all来应用相同的str_replace来去除标签。

library(dplyr)
library(tidyr)
library(stringr)
as.data.frame(extsample) %>% 
  extract(1, into=c("Name","Location","Date","Time","Warning"),
             regex = "(Name : .+)[^$]*(Location : .+)[^$]*(Date : .+)[^$]*(Time : .+)[^$]*(Warning : .+)[^$]*") %>%
  mutate_all(list(~str_replace(.,"^\\w+ : ","")))
#          Name               Location       Date     Time
#1 York-APC-UPS York SCATS Zigzag Road 12/06/2018 08:45:46
#                                                                                     Warning
#1 A high humidity threshold violation exists for integrated Environmental Monitor TH Sensor 

这取决于使用()捕获组,有关详细信息,请参见help(tidyr::extract)。我们使用[^$]*来匹配组之间字符串0或更多次以外的任何其他字符。

请注意,extract的第一个参数是1,它表示根据您的示例数据得出的data.frame的第一列(也是唯一列)。视需要进行更改。