1

我是 R 新手,但一直在遵循一个很好的指南来提供帮助。

我已经导入了过去 36 个月的销售数据,使用 tidyr 将 Date 列移动到行,然后将 Date 字符串清理为 Month Date、Year。

我的问题是:我需要每个月更新这个文件,并且会有一个新的、滚动的 36 个月的周期。我创建的用于自动化新期间的功能是否有改进(例如,当前 36 个月期间从 2013 年 9 月 1 日开始,下一个 36 个月期间从 2013 年 10 月 1 日开始,等等)。

关于如何做到这一点而不必剪切和粘贴的任何想法?

下面是我的代码

# import rolling periods
rolling <- read.csv("h:/R/BI with R/Rolling Periods.csv", header=T)

# remove last four columns
rolling <- rolling[,-c(42:45)]

# gather columns to rows with tidyr
require(tidyr)
rolling <- gather(rolling, "Date", "CSE", 6:41)

head(rolling)

# list from Date column
unique(rolling$Date)

# clean Date variable
clean = function(col) {
  col = gsub('X1.Month.9.1.2013.thru.9.30.2013..Case.Equivs', 'September 1, 2013', col, fixed = TRUE)
  col = gsub('X1.Month.10.1.2013.thru.10.31.2013..Case.Equivs', 'October 1, 2013', col, fixed = TRUE)
  col = gsub('X1.Month.11.1.2013.thru.11.30.2013..Case.Equivs', 'November 1, 2013', col, fixed = TRUE)
  col = gsub('X1.Month.12.1.2013.thru.12.31.2013..Case.Equivs', 'December 1, 2013', col, fixed = TRUE)
  col = gsub('X1.Month.1.1.2014.thru.1.31.2014..Case.Equivs', 'January 1, 2014', col, fixed = TRUE)
  col = gsub('X1.Month.2.1.2014.thru.2.28.2014..Case.Equivs', 'February 1, 2014', col, fixed = TRUE)
  col = gsub('X1.Month.3.1.2014.thru.3.31.2014..Case.Equivs', 'March 1, 2014', col, fixed = TRUE)
  col = gsub('X1.Month.4.1.2014.thru.4.30.2014..Case.Equivs', 'April 1, 2014', col, fixed = TRUE)
  col = gsub('X1.Month.5.1.2014.thru.5.31.2014..Case.Equivs', 'May 1, 2014', col, fixed = TRUE)
  col = gsub('X1.Month.6.1.2014.thru.6.30.2014..Case.Equivs', 'June 1, 2014', col, fixed = TRUE)
  col = gsub('X1.Month.7.1.2014.thru.7.31.2014..Case.Equivs', 'July 1, 2014', col, fixed = TRUE)
  col = gsub('X1.Month.8.1.2014.thru.8.31.2014..Case.Equivs', 'August 1, 2014', col, fixed = TRUE)
  col = gsub('X1.Month.9.1.2014.thru.9.30.2014..Case.Equivs', 'September 1, 2014', col, fixed = TRUE)
  col = gsub('X1.Month.10.1.2014.thru.10.31.2014..Case.Equivs', 'October 1, 2014', col, fixed = TRUE)
  col = gsub('X1.Month.11.1.2014.thru.11.30.2014..Case.Equivs', 'November 1, 2014', col, fixed = TRUE)
  col = gsub('X1.Month.12.1.2014.thru.12.31.2014..Case.Equivs', 'December 1, 2014', col, fixed = TRUE)
  col = gsub('X1.Month.1.1.2015.thru.1.31.2015..Case.Equivs', 'January 1, 2015', col, fixed = TRUE)
  col = gsub('X1.Month.2.1.2015.thru.2.28.2015..Case.Equivs', 'February 1, 2015', col, fixed = TRUE)
  col = gsub('X1.Month.3.1.2015.thru.3.31.2015..Case.Equivs', 'March 1, 2015', col, fixed = TRUE)
  col = gsub('X1.Month.4.1.2015.thru.4.30.2015..Case.Equivs', 'April 1, 2015', col, fixed = TRUE)
  col = gsub('X1.Month.5.1.2015.thru.5.31.2015..Case.Equivs', 'May 1, 2015', col, fixed = TRUE)
  col = gsub('X1.Month.6.1.2015.thru.6.30.2015..Case.Equivs', 'June 1, 2015', col, fixed = TRUE)
  col = gsub('X1.Month.7.1.2015.thru.7.31.2015..Case.Equivs', 'July 1, 2015', col, fixed = TRUE)
  col = gsub('X1.Month.8.1.2015.thru.8.31.2015..Case.Equivs', 'August 1, 2015', col, fixed = TRUE)
  col = gsub('X1.Month.9.1.2015.thru.9.30.2015..Case.Equivs', 'September 1, 2015', col, fixed = TRUE)
  col = gsub('X1.Month.10.1.2015.thru.10.31.2015..Case.Equivs', 'October 1, 2015', col, fixed = TRUE)
  col = gsub('X1.Month.11.1.2015.thru.11.30.2015..Case.Equivs', 'November 1, 2015', col, fixed = TRUE)
  col = gsub('X1.Month.12.1.2015.thru.12.31.2015..Case.Equivs', 'December 1, 2015', col, fixed = TRUE)
  col = gsub('X1.Month.1.1.2016.thru.1.31.2016..Case.Equivs', 'January 1, 2016', col, fixed = TRUE)
  col = gsub('X1.Month.2.1.2016.thru.2.28.2016..Case.Equivs', 'February 1, 2016', col, fixed = TRUE)
  col = gsub('X1.Month.3.1.2016.thru.3.31.2016..Case.Equivs', 'March 1, 2016', col, fixed = TRUE)
  col = gsub('X1.Month.4.1.2016.thru.4.30.2016..Case.Equivs', 'April 1, 2016', col, fixed = TRUE)
  col = gsub('X1.Month.5.1.2016.thru.5.31.2016..Case.Equivs', 'May 1, 2016', col, fixed = TRUE)
  col = gsub('X1.Month.6.1.2016.thru.6.30.2016..Case.Equivs', 'June 1, 2016', col, fixed = TRUE)
  col = gsub('X1.Month.7.1.2016.thru.7.31.2016..Case.Equivs', 'July 1, 2016', col, fixed = TRUE)
  col = gsub('X1.Month.8.1.2016.thru.8.31.2016..Case.Equivs', 'August 1, 2016', col, fixed = TRUE)
  return(col)
}

rolling$Date = clean(rolling$Date)
head(rolling)

# convert to Date object
rolling$Date = as.Date(rolling$Date, format="%B %d, %Y")
head(rolling)
4

2 回答 2

1

您似乎只查看滚动日期的第一部分来确定代表日期(您要替换的日期)。在这种情况下,您可以在使用 gsub 和正则表达式时利用反向引用进行替换

# Function might not be need now
clean  <- function(col) {
    col <- gsub("X1\\.Month\\.(\\d{1,2})\\.(\\d{1,2})\\.(\\d{4}).thru.*","\\1 \\2 \\3", col)
}

head(rolling)

# convert to Date object
#Note the new date fomat
rolling$Date <- as.Date(rolling$Date, format="%m %d %Y")
head(rolling)

如果您还需要滚动日期的结束日期,您仍然可以使用更多的反向引用来捕获结束日期。

于 2016-09-30T00:25:06.510 回答
1

使用点作为字段分隔符将列转换为数据框,然后使用sprintf和格式化,month.name如下所示:

clean2 <- function(x) {
  DF <- read.table(text = x, sep = ".")
  with(DF, sprintf("%s %d, %d", month.name[V3], V4, V5))
}

最后一条语句也可以写成:

with(DF, format(as.Date(paste(V5, V3, V4, sep = "-")), "%B %e, %Y"))

例子

例如,使用下面注释中的输入:

clean2(x)
## [1] "September 1, 2013" "October 1, 2013"   "November 1, 2013" 

注意:以下是一些可重现形式的示例数据:

x <- c("X1.Month.9.1.2013.thru.9.30.2013..Case.Equivs",  
       "X1.Month.10.1.2013.thru.10.31.2013..Case.Equivs", 
       "X1.Month.11.1.2013.thru.11.30.2013..Case.Equivs")
于 2016-09-30T01:06:53.303 回答