2016-09-29 10 views
1

Я новичок в R, но следил за довольно хорошим руководством, чтобы помочь на этом пути.Создание цикла для конвертирования периодов даты кадрирования в as.Date

Я импортировал данные о продажах за последние 36 месяцев, использовал tidyr для перемещения столбцов Date в строки, а затем очистил строку символов Date до даты месяца, года.

Мой вопрос: мне нужно обновлять этот файл каждый месяц и иметь новый, прокатный 36-месячный период. Существует ли улучшение функции, которую я создал для автоматизации новых периодов (например, текущий 36-месячный период начинается 1 сентября 2013 года, следующий 36-месячный период начинается 1 октября 2013 года и т. Д.).

Любые идеи о том, как это сделать без необходимости вырезать и вставлять?

Ниже мой код

# 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) 
+0

Синтаксический дата: 'прокатке $ Date_clean <- as.Date (прокатка $ Дата, 'X1.Month.% M.% D.% Y') '. Затем вы можете использовать 'format (roll $ Date_clean, '% B% e,% Y')', если вам нужна дата символа. – alistaire

ответ

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) 

Если вам также необходимы на дату окончания прокатки даты, вы можете все еще использовать больше обратные ссылки, чтобы захватить дату окончания.

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")