按给定的字符数拆分数字列数据

时间:2017-06-13 15:05:10

标签: r strsplit

我正在尝试将一列拆分为三列,以便我可以提供日期格式。 目前,数据集如下所示

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)

4 个答案:

答案 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