我正在尝试将一列拆分为三列,以便我可以提供日期格式。 目前,数据集如下所示
YYYYMMDD Number
20020101 0.21
20020102 0.34
20020103 1.22
我希望它看起来像这样
Year Month Day Number
2002 01 01 0.21
2002 01 02 0.34
2002 01 03 1.22
我编写了以下代码,它的工作原理是我可以拆分列,但是这样做我创建了新的数据框,我不确定如何将data.frame添加回原始数据.set
有更好的方法吗?或者如何让new2 + new与数据结合?
res <- strsplit(data$YYYYMMDD, "(?<=.{4})" , perl = TRUE)
new<-do.call(rbind, res)
summary(new)
colnames(new)<-c("Year", "MMDD")
new<-as.data.frame(new)
new$MMDD<-as.character(new$MMDD)
res <- strsplit(new$MMDD, "(?<=.{2})" , perl = TRUE)
new2<-do.call(rbind, res)
summary(new2)
colnames(new2)<-c("Month", "Dom")
new2<-as.data.frame(new2)
答案 0 :(得分:2)
使用substring
:
x <- mapply(substring, c(1, 5, 7), c(4, 6, 8),
MoreArgs = list(text = df$YYYYMMDD), SIMPLIFY = F)
names(x) <- c('Year', 'Month', 'Day')
cbind(as.data.frame(x), df[-1])
# Year Month Day Number
# 1 2002 01 01 0.21
# 2 2002 01 02 0.34
# 3 2002 01 03 1.22
答案 1 :(得分:1)
我们可以使用map
separate
答案 2 :(得分:1)
您可以尝试此操作(将变量YYYYMMDD作为字符):
year = substr(data$YYYYMMDD,1,4)
month = substr(data$YYYYMMDD,5,6)
day = substr(data$YYYYMMDD,7,8)
new_data = as.data.frame(cbind(year,month,day,data$Number))
colnames(new_data)[4] = "Number"
答案 3 :(得分:0)
您可以lubridate
这样做:
library(tidyverse)
library(lubridate)
data %>%
mutate(
YYYYMMDD = as.Date(as.character(YYYYMMDD), format = "%Y%m%d"),
year = year(YYYYMMDD),
month = month(YYYYMMDD),
day = mday(YYYYMMDD)
)
#> YYYYMMDD Number year month day
#> 1 2002-01-01 0.21 2002 1 1
#> 2 2002-01-02 0.34 2002 1 2
#> 3 2002-01-03 1.22 2002 1 3