Стереть место в расщеплении - R - PullRequest
0 голосов
/ 15 мая 2018

У меня есть фрейм данных, в котором я разделил столбец datetime на дату и время (два столбца).Однако, когда я группирую по времени, это дает мне дубликаты во времени.Итак, для анализа я использовал table () в столбце времени, и он также дал мне дубликаты.Вот пример этого:

> table(df$time)
 00:00:00 00:00:00   00:15:00 00:15:00   00:30:00 00:30:00
     2211      1047      2211      1047      2211      1047

Как вы можете видеть, когда я разделил одно из «уникальных» значений, внутри было " ".Есть ли простой способ решить эту проблему?

PS: тип данных столбца времени - символ.

РЕДАКТИРОВАТЬ: Код добавлен

df$datetime <- as.character.Date(df$datetime)
x <- colsplit(df$datetime, ' ', names =  c('Date','Time'))
df <- cbind(df, x)

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

reshape2::colsplit принимает регулярные выражения, поэтому вы можете разбить на '\ s +', который соответствует 1 или более пробельных символов.

Вы можете узнать больше о регулярных выражениях в R, используя ?base::regex.Синтаксис, как правило, постоянен между языками, поэтому вы можете использовать практически любой учебник по регулярным выражениям.Взгляните на https://regex101.com/. Этот сайт оценивает ваши регулярные выражения в режиме реального времени и показывает вам, что соответствует каждой части.Это чрезвычайно полезно!

Имейте в виду, что в R по сравнению с большинством других языков вы должны удвоить число обратных косых черт \.Поэтому \s (для соответствия 1 пробелу) должен быть записан как \\s в R.

0 голосов
/ 16 мая 2018

Есть несколько подходов.Одним из них является использование соответствующих функций для извлечения даты и времени из столбца Datetime:

df <- data.frame(datetime = seq(
  from=as.POSIXct("2018-5-15 0:00", tz="UTC"),
  to=as.POSIXct("2018-5-16 24:00", tz="UTC"),
  by="30 min") )

head(df$datetime)
#[1] "2018-05-15 00:00:00 UTC" "2018-05-15 00:30:00 UTC" "2018-05-15 01:00:00 UTC" "2018-05-15 01:30:00 UTC"
#[5] "2018-05-15 02:00:00 UTC" "2018-05-15 02:30:00 UTC"

df$Date <- as.Date(df$datetime)
df$Time <- format(df$datetime,"%H:%M:%S")

    head(df)
#     datetime       Date     Time
# 1 2018-05-15 00:00:00 2018-05-15 00:00:00
# 2 2018-05-15 00:30:00 2018-05-15 00:30:00
# 3 2018-05-15 01:00:00 2018-05-15 01:00:00
# 4 2018-05-15 01:30:00 2018-05-15 01:30:00
# 5 2018-05-15 02:00:00 2018-05-15 02:00:00
# 6 2018-05-15 02:30:00 2018-05-15 02:30:00


table(df$Time)
#00:00:00 00:30:00 01:00:00 01:30:00 02:00:00 02:30:00 03:00:00 03:30:00 04:00:00 04:30:00 05:00:00 05:30:00 
#3        2        2        2        2        2        2        2        2        2        2        2 
#06:00:00 06:30:00 07:00:00 07:30:00 08:00:00 08:30:00 09:00:00 09:30:00 10:00:00 10:30:00 11:00:00 11:30:00 
#2        2        2        2        2        2        2        2        2        2        2        2 
#12:00:00 12:30:00 13:00:00 13:30:00 14:00:00 14:30:00 15:00:00 15:30:00 16:00:00 16:30:00 17:00:00 17:30:00 
#2        2        2        2        2        2        2        2        2        2        2        2 
#18:00:00 18:30:00 19:00:00 19:30:00 20:00:00 20:30:00 21:00:00 21:30:00 22:00:00 22:30:00 23:00:00 23:30:00 
#2        2        2        2        2        2        2        2        2        2        2        2 




#If the data were given as character strings and contain extra spaces the above approach will still work
df <- data.frame(datetime=c("2018-05-15 00:00:00","2018-05-15   00:30:00",
                            "2018-05-15  01:00:00", "2018-05-15      02:00:00",
                            "2018-05-15 00:00:00","2018-05-15   00:30:00"), 
                 stringsAsFactors=FALSE)

df$Date <- as.Date(df$datetime)
df$Time <- format(as.POSIXct(df$datetime, tz="UTC"),"%H:%M:%S")
head(df)
#                   datetime       Date     Time
# 1      2018-05-15 00:00:00 2018-05-15 00:00:00
# 2    2018-05-15   00:30:00 2018-05-15 00:30:00
# 3     2018-05-15  01:00:00 2018-05-15 01:00:00
# 4 2018-05-15      02:00:00 2018-05-15 02:00:00
# 5      2018-05-15 00:00:00 2018-05-15 00:00:00
# 6    2018-05-15   00:30:00 2018-05-15 00:30:00

table(df$Time)
#00:00:00 00:30:00 01:00:00 02:00:00 
#       2        2        1        1 
...