Имам рамка за данни по следния начин:
Date
20130101
20130102
20130103
20130104
как мога да разделите колона Дата в различна колона? Вече използвах следната функция, но тя не работи:
library(data.table)
setDT(DF)[, tstrsplit(DATE, "/|\s", type.convert = TRUE)]
Отговори:
2 за отговор № 1Ето някои решения, които не изискват никакви пакети. Всички те създават data.frame с a "Date"
колона клас, последвана от числови колони за година, месец и ден. (Входът, използван в възпроизводима форма, е даден в бележката в края.)
1) POSIXlt Първо конвертирайте Date
колона до "Date"
даване на класове date
и след това към некласифициран "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.table
date.ch <- sub("(....)(..)(..)", "\1-\2-\3", DF$Date)
data.frame(date = as.Date(date.ch),
read.table(text = date.ch, col.names = c("year", "month", "day"), sep = "-"))
като:
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 за отговор № 2
Ако не сте задали за използване 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))
Ако сте сигурни, че данните ви са в същия формат за целия вектор.
0 за отговор № 3
Можете също да направите това с 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))