我有一个这种形式的数据文件,我将其作为数据框加载到R中:
Week,Sales
"Jan WK01, FY14",99
"Jan WK02, FY14",754
"Jan WK03, FY14",841
"Jan WK04, FY14",722
"Feb WK01, FY15",846
"Feb WK02, FY15",927
"Feb WK03, FY15",940
"Feb WK04, FY15",661
"Mar WK01, FY15",729
"Mar WK02, FY15",916
"Mar WK03, FY15",1317
"Mar WK04, FY15",1415
"Mar WK05, FY15",1462
如何将第一个字段转换为xts()将其理解为一周的内容,以便我可以分析销售时间序列?
我想避免这个错误:
Error in xts(Data, order.by = Data$Week) :
order.by requires an appropriate time-based object
答案 0 :(得分:3)
以下函数输入"Date"
类变量并输出下周一的"Date"
。
nextMon <- function(x) x + (as.numeric(format(x, "%w")) - 1) %% 7
(在我的答案中可以找到不同的版本:Extract first Monday of every month以及动物园软件包Quick Reference vignette中下周五的相应功能。
现在给出问题的输入字符串x
(请参阅下面的注释,x
可重复给出)我们可以推导出它的第一个月(fom
)和周数(wk
)。如果wk
为1,则7天后如果wk
为2,那么对应于该月份和周数的给定第一个月份的日期将是该月初或之后的下一个星期一,14天后如果一周是3,依此类推。
fom <- as.Date(sub("WK.*FY", "1 ", x), "%b %d %y") # first of month
wk <- as.numeric(gsub(".*WK|,.*", "", x)) # week number
nextMon(fom) + 7 * (wk-1)
,并提供:
[1] "2014-01-06" "2014-01-13" "2014-01-20" "2014-01-27" "2015-02-02"
[6] "2015-02-09" "2015-02-16" "2015-02-23" "2015-03-02" "2015-03-09"
[11] "2015-03-16" "2015-03-23" "2015-03-30"
请注意,如果财政年度和日历年不同,则必须根据会计年度实际结束时进一步调整答案。
如果您喜欢星期日开始的周数,请将nextMon
中的1替换为0
。
注意:我们在此重复定义输入x
:
x <- c("Jan WK01, FY14", "Jan WK02, FY14", "Jan WK03, FY14", "Jan WK04, FY14",
"Feb WK01, FY15", "Feb WK02, FY15", "Feb WK03, FY15", "Feb WK04, FY15",
"Mar WK01, FY15", "Mar WK02, FY15", "Mar WK03, FY15", "Mar WK04, FY15",
"Mar WK05, FY15")