【发布时间】:2015-07-16 15:03:38
【问题描述】:
我想在任何非数字上分割字符串。在这种特殊情况下,字符串是从外部.csv 文件中读取的日期和时间,当前不是as.POSIXct 格式。
理想情况下,我想使用regex 拆分字符串,但如果有更简单的方法可以使用date / time 函数将它们转换为六列数字,那也会很有趣。
我已经成功创建了一个regex,它将字符串分成六列,但是这个regex并不通用。
以下是数据:
my.data <- read.csv(text = '
Date_Time
18/05/2011 07:32:40
19/05/2011 13:26:02
19/05/2011 13:32:47
19/05/2011 13:45:24
19/05/2011 14:57:27
19/05/2011 15:03:18
', header=TRUE, stringsAsFactors = FALSE, na.strings = 'NA', strip.white = TRUE)
这是一个regex 语句,它将字符串分成六列:
my.date.time <- data.frame(do.call(rbind, strsplit(my.data$Date_Time,"[/|:|[:space:]]+") ))
上述说法并不笼统。这是通过在任何非数字上指定拆分来使 regex 通用的不成功尝试:
data.frame(do.call(rbind, strsplit(my.data$Date_Time,"[^\\d]+") ))
在我将字符串分成六列后,我仍然需要看起来过多的语句来将列转换为数字格式:
colnames(my.date.time) <- c('my.day', 'my.month', 'my.year', 'my.hour', 'my.minute', 'my.second')
revised.data <- data.frame(my.data, my.date.time, stringsAsFactors = FALSE)
revised.data$my.day <- as.numeric(as.character(revised.data$my.day))
revised.data$my.month <- as.numeric(as.character(revised.data$my.month))
revised.data$my.year <- as.numeric(as.character(revised.data$my.year))
revised.data$my.hour <- as.numeric(as.character(revised.data$my.hour))
revised.data$my.minute <- as.numeric(as.character(revised.data$my.minute))
revised.data$my.second <- as.numeric(as.character(revised.data$my.second))
revised.data
str(revised.data)
感谢您在概括上述regex(或使用date / time 函数简化程序)方面提供的任何帮助。 apply 函数可能可以消除大部分 as.numeric(as.character) 语句,尽管这是一个相对较小的问题。
【问题讨论】:
-
[^\\d] 不工作?
-
@drmariod 不。它只是返回空白。
-
apply(my.data, 1, strsplit, "[^[:digit:]]"),之后就是我认为的unlist和rbind结果的问题。 -
@SabDeM 谢谢。这样可行。考虑将其发布为答案。如果不接受,我会投票。
-
@MarkMiller 好的,我已经发布了最终输出。
标签: regex r string datetime split