2016-04-04 3 views
0

У меня есть кадр данных, как это:Дата расколоть в R

Date 
20130101 
20130102 
20130103 
20130104 

как я могу разделить Дата столбца в другом столбце? Я уже использовал следующие функции, но он не работает:

library(data.table) 
setDT(DF)[, tstrsplit(DATE, "/|\\s", type.convert = TRUE)] 
+0

'tstrsplit' расщепляется на существующих символов в строке. Я думаю, что вы хотите либо '? Strptime', либо'? As.IDate', который будет анализировать дату; или '? substr', который позволит вам выбрать подстроки. – Frank

ответ

2

Вот некоторые решения, которые не требуют каких-либо пакетов. Все они производят data.frame с столбцом класса "Date", за которым следуют числовые столбцы за год, месяц и день. (Вход используется в воспроизводимой форме дается в примечании в конце.)

1) POSIXlt Сначала преобразовать Date столбец "Date" класса давая date, а затем к unclassed "POSIXlt" объекта дает lt. Теперь обрывать элементы lt надлежащим образом:

date <- as.Date(as.character(DF$Date), format = "%Y%m%d") 
lt <- unclass(as.POSIXlt(date)) 
with(lt, data.frame(Date = date, year = year + 1900, month = mon + 1, day = mday)) 

подача: Формат

 Date year month day 
1 2013-01-01 2013  1 1 
2 2013-01-02 2013  1 2 
3 2013-01-03 2013  1 3 
4 2013-01-04 2013  1 4 

2)

data.frame(date = as.Date(as.character(DF$Date), format = "%Y%m%d"), 
      year = as.numeric(format(date, "%Y")), 
      month = as.numeric(format(date, "%m")), 
      day = as.numeric(format(date, "%d"))) 

давая:

 date year month day 
1 2013-01-01 2013  1 1 
2 2013-01-02 2013  1 2 
3 2013-01-03 2013  1 3 
4 2013-01-04 2013  1 4 

3) по математике

with(DF, data.frame(date = as.Date(as.character(DF$Date), format = "%Y%m%d"), 
        year = Date %/% 10000, 
        month = Date %% 10000 %/% 100, 
        day = Date %% 100)) 

давая:

 date year month day 
1 2013-01-01 2013  1 1 
2 2013-01-02 2013  1 2 
3 2013-01-03 2013  1 3 
4 2013-01-04 2013  1 4 

4) read.fwf

data.frame(date = as.Date(as.character(DF$Date), format = "%Y%m%d"), 
      read.fwf(textConnection(as.character(DF$Date)), c(4, 2, 2), 
        col.names = c("year", "month", "day"))) 

давая:

 date year month day 
1 2013-01-01 2013  1 1 
2 2013-01-02 2013  1 2 
3 2013-01-03 2013  1 3 
4 2013-01-04 2013  1 4 

5) sub/read.Таблица

давая:

 date year month day 
1 2013-01-01 2013  1 1 
2 2013-01-02 2013  1 2 
3 2013-01-03 2013  1 3 
4 2013-01-04 2013  1 4 

Примечание: вход используется, "DF", в воспроизводимая форма:

DF <- data.frame(Date = 20130101:20130104) 
0

Если вы не установите на использовании data.table вы можете использовать следующую команду, которая включает в себя substr:

x = data.frame("20130101", "20130102", "20130103", "20130104") 

y<-data.frame(Year=substr(x[,1],1,4), 
       Month=substr(x[,1],5,6), 
       Day=substr(x[,1],7,8)) 

Если вы уверены, что ваши данные в том же формате для всего вектора.

+1

нет причин, по которым вы не можете использовать 'substr' в' data.table' тоже – arvi1000

0

Вы также можете сделать это с lubridate

library(dplyr) 
library(lubridate) 

data = 
    data_frame(Date = c(20130101, 20130102, 20130103, 20130104)) %>% 
    mutate(date = 
      Date %>% 
      as.character %>% 
      ymd, 
     year = year(date), 
     month = month(date), 
     day = day(date)) 
Смежные вопросы