2015-07-16 2 views
2

Я хотел бы разделить строки на что-нибудь не цифру. В этом конкретном случае строки были датами и временем, считываемыми из внешнего файла .csv и в настоящее время не в формате as.POSIXct.regex, чтобы разделить на что-нибудь не цифру

В идеале я хотел бы разделить строки с помощью 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), хотя это относительно небольшая проблема.

+0

[^ \\ d] не работает? – drmariod

+0

@drmariod No. Он просто возвращает пустое пространство. –

+1

'apply (my.data, 1, strsplit," [^ [: digit:]] ")', после чего это всего лишь вопрос о перечне и rbind результаты, которые я думаю. – SabDeM

ответ

3

Может быть, я что-то пропустил, но вот мое решение:

lisda <- apply(my.data, 1, strsplit, "[^[:digit:]]") 
my.data2 <- t(data.frame(lisda)) 
my.data2 
      [,1] [,2] [,3] [,4] [,5] [,6] 
Date_Time "18" "05" "2011" "07" "32" "40" 
Date_Time.1 "19" "05" "2011" "13" "26" "02" 
Date_Time.2 "19" "05" "2011" "13" "32" "47" 
Date_Time.3 "19" "05" "2011" "13" "45" "24" 
Date_Time.4 "19" "05" "2011" "14" "57" "27" 
Date_Time.5 "19" "05" "2011" "15" "03" "18" 

Только в случае, если вы хотите, чтобы преобразовать их все к числовому.

apply(my.data2, 2, function(x) as.numeric(as.character(x))) 
+0

хорошее решение. Я думаю, вы также можете избежать 'as.character' на последнем шаге, поскольку' x' уже является символом –

+0

@VeerendraGadekar. Я знаю, что вы правы, но я не помню, где я видел объяснение этого кода и причины, по которым это лучше сделать это, или, может быть, это просто фактор, который я не помню. Сомневаюсь, что я сохраню этот код. – SabDeM

4

Дайте попробовать на \\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" 
1

Использование cSplit

library(splitstackshape) 
tmp = cSplit(my.data, "Date_Time", "/") 
out = cSplit(tmp, "Date_Time_3", ":") 

если вы читаете данные, как этот

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, sep =' ' ,stringsAsFactors = FALSE, na.strings = 'NA', strip.white = TRUE) 

вы могли бы сделать

library(splitstackshape) 
out = cSplit(my.data, splitCols = c("Date", "Time"), sep = c("/", ":")) 

#> out 
# Date_1 Date_2 Date_3 Time_1 Time_2 Time_3 
#1:  18  5 2011  7  32  40 
#2:  19  5 2011  13  26  2 
#3:  19  5 2011  13  32  47 
#4:  19  5 2011  13  45  24 
#5:  19  5 2011  14  57  27 
#6:  19  5 2011  15  3  18 
1

Вы могли бы рассмотреть возможность использования read.pattern от gsubfn пакет для этого:

library(gsubfn) 
read.pattern(text = my.data$Date_Time, pattern = "\\d+") 

# V1 V2 V3 V4 V5 V6 
# 1 18 5 2011 7 32 40 
# 2 19 5 2011 13 26 2 
# 3 19 5 2011 13 32 47 
# 4 19 5 2011 13 45 24 
# 5 19 5 2011 14 57 27 
# 6 19 5 2011 15 3 18 

Тогда вы можете просто присвоить имена столбцов, как вы хотите.

+0

Спасибо, очень полезно! –