【发布时间】: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 分隔函数,但无法为分隔符编写正则表达式。
【问题讨论】:
我有一个 data.frame,其中一列具有这样的结构:
"2019-09-11 13:29:55:647 INFO".
如何将此列分成三列,其中:
"2019-09-11 13:29:55"
"647"
"INFO"。我想使用tidyr 分隔函数,但无法为分隔符编写正则表达式。
【问题讨论】:
我们可以在插入分隔符后使用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)
【讨论】: