【问题标题】:How to separate a column into threecolumns with R?如何用R将一列分成三列?
【发布时间】:2019-12-02 14:23:08
【问题描述】:

我有一个 data.frame,其中一列具有这样的结构: "2019-09-11 13:29:55:647 INFO".

如何将此列分成三列,其中:

  • 第 1 列是:"2019-09-11 13:29:55"
  • 第2栏是:"647"
  • 第 3 列是"INFO"

我想使用tidyr 分隔函数,但无法为分隔符编写正则表达式。

【问题讨论】:

    标签: r tidyr separator


    【解决方案1】:

    我们可以在插入分隔符后使用read.csv

    cbind(df1, read.csv(text = sub("^(\\S+) (\\S+):([^:]+)$", 
             "\\1,\\2,\\3", df1$datetime), col.names =c('newcol1', 'newcol2', 'newcol3'),
          header = FALSE, stringsAsFactors = FALSE))
    

    如果我们使用tidyverse,请使用正则表达式环视来指定sep,即匹配: 后跟不是: 的字符直到末尾或两位数之间的空格

    library(tidyr)
    separate(df1, datetime, into = c('newcol1', 'newcol2', 'newcol3'), 
            sep="(?<=\\d) (?=\\d)|:(?=[^:]+$)")
     #   newcol1  newcol2  newcol3
    #1 2019-09-11 13:29:55 647 INFO
    

    或使用extract,将字符作为一个组捕获,直到最后一个:,后跟数字直到字符串的末尾

    extract(df1, datetime, into = c('newcol1', 'newcol2', 'newcol3'), 
            "^(\\S+)\\s(.*):([^:]+)$")
    #    newcol1  newcol2  newcol3
    #1 2019-09-11 13:29:55 647 INFO
    

    数据

    df1 <- data.frame(datetime = "2019-09-11 13:29:55:647 INFO", 
            stringsAsFactors = FALSE)
    

    【讨论】:

    • 你能用 tidyverse 分离函数来做吗?
    • 对不起,我写错了一个专栏。其 2019-09-11 13:29:55:647 INFO 并分为 2019-09-11 13:29:55 和 647 INFO
    • @EdZ 您需要 3 列还是 2 列?
    • 三:2019-09-11 13:29:55, 647, INFO
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多