2013-09-19 4 views
1

Я очень новичок в R и стараюсь манипулировать своими данными в excel, прежде чем переместить его в R как файл csv. Я хотел бы использовать ts() для еженедельных данных. Можете ли вы сделать что-то такое же простое, как месяц 1-12, неделя 1-4, год? MWY. Я думал, что если я использую 1-7-й день в качестве первой недели и так далее, это будет равномерным и легко работать для моей цели, но я не знаю, как его написать. Используя этот сайт, а другие для урока я пришел с этим:Временные ряды еженедельные данные

myts <- ts(Time2012, start = c(8/3/2013,1), end = c(9/2/2013,4), frequency = 52) 

есть ли простой способ для обозначения даты, чтобы показать, что я хочу считать недели?

+0

Непонятно, что вы спрашиваете. Вы должны дать образец (воспроизводимый пример) вашего ввода и желаемый результат. – agstudy

+0

В дополнение к предоставлению [воспроизводимого и минимального примера] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) вы должны лучше описать свой вопрос. Что вы собираетесь производить? Почему объект 'ts', а не (скажем) объект' zoo'? Может быть, простой фрейм данных будет работать лучше - больше контекста, пожалуйста. – SlowLearner

+0

Также прочитайте [this] (http://meta.stackoverflow.com/help/how-to-ask) и [это] (http://meta.stackexchange.com/questions/156810/stack-overflow-question -checklist). Благодарю. – Henrik

ответ

1

я бы рекомендовал немного другой рабочий процесс, тот, который вы, вероятно, найти имеет более широкую полезность:

> end = Sys.Date() 
> start = end - 365 

> class 

> # create the index array comprised of date objects 
> ndx = seq(start, end, by='weeks') 
> class(ndx) 
    [1] "Date" 
> length(ndx) 
    [1] 53 

> # create a fake data array 
> x = 1:length(ndx) 
> mydata = sin(x/2) 

> # import a time series library 
> require(xts) 

> # create the time series 
> myts = xts(mydata, order.by=ndx) 

> myts[1:5] 
       [,1] 
    2012-09-19 3.479426 
    2012-09-26 3.841471 
    2012-10-03 3.997495 
    2012-10-10 3.909297 
    2012-10-17 3.598472 

> class(myts) 
    [1] "xts" "zoo" 

> periodicity(myts) 
    Weekly periodicity from 2012-09-19 to 2013-09-18 

В качестве альтернативы, если данные не по неделям, то вы можете создать временную ряд, имеющую более высокое разрешение (например, дни), а затем раскатать его до недели:

> ndx = seq(start, end, by='days') 

> x = 1:length(ndx) 
> mydata = sin(x/2) + 3 
> myts = xts(mydata, order.by=ndx) 

> myts[1:5] 
      [,1] 
2012-09-19 3.479426 
2012-09-20 3.841471 
2012-09-21 3.997495 
2012-09-22 3.909297 
2012-09-23 3.598472 

> periodicity(myts) 
    Daily periodicity from 2012-09-19 to 2013-09-19 

> # now roll-up this daily series to weeks 

> require(xts) 

> # first create the endpoints 
> np = endpoints(myts, on='weeks') 


> myts_weeks = period.apply(x=myts, INDEX=np, FUN=sum, na.rm=TRUE) 
> myts_weeks[1:5] 
       [,1] 
    2012-09-23 18.82616 
    2012-09-30 17.11212 
    2012-10-07 24.93492 
    2012-10-14 17.51811 
    2012-10-21 23.58635 

> periodicity(myts_weeks) 
    Weekly periodicity from 2012-09-23 to 2013-09-19 
1

более простым способом создать набор год, месяц, неделю (месяц) находится с lubridate.

require(lubridate) 

# Your starting date, plus 52 more dates at weekly intervals 
xDates <- dmy("8/3/2013") + weeks(0:52) 

# A data frame of the dates, the month of the year, and the week of the month 
xYMW <- data.frame(date=(xDates), month=month(xDates), week=mday(xDates) %/% 7 + 1) 
xYMW[1:5, ] 
     date month week 
1 2013-03-08  3 2 
2 2013-03-15  3 3 
3 2013-03-22  3 4 
4 2013-03-29  3 5 
5 2013-04-05  4 1 
Смежные вопросы