我想在不是数字的任何东西上拆分字符串。在这种特殊情况下,字符串是从外部 .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+
> x <- "18/05/2011 07:32:40"
> strsplit(x, "\\D+")
[[1]]
[1] "18" "05" "2011" "07" "32" "40"
或
> strsplit(x, "[^0-9]+")
[[1]]
[1] "18" "05" "2011" "07" "32" "40"
关于正则表达式拆分任何不是数字的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31457914/