Преобразование ежедневного в еженедельное, где неделя начинается каждый вторник в R

Вот код: РЕДАКТИРОВАТЬ: СМ. ВОСПРОИЗВОДИМЫЙ КОД НИЖЕ

>require("quantmod")   
>
> corn <- as.xts(read.zoo("~/CORN.csv", sep=",", format ="%m/%d/%Y", header=TRUE))
> 
> head(corn)
           [,1]
1962-01-03 4.03
1962-01-04 3.99
1962-01-05 4.02
1962-01-08 4.03
1962-01-09 4.05
1962-01-10 4.07
> 
> corn <- to.weekly(corn)[,4]
> 
> head(corn)
           corn.Close
1962-01-05       4.02
1962-01-12       4.08
1962-01-19       4.11
1962-01-26       4.11
1962-02-02       4.08
1962-02-09       4.05

Как вы начинаете каждую неделю во вторник? Что-то в духе

indexAt='startof("Tuesday")'

где indexAt — переменная параметра в функции to.weekly().

Целью этого является согласование с еженедельными данными COT.

РЕДАКТИРОВАТЬ ##################

Я создал некоторую путаницу, не предоставив воспроизводимый код, поэтому вот некоторые из них с частичным решением, включенным на основе предложений Дж. Винчестера ниже:

> getSymbols("GLD")
[1] "GLD"
> GLD <- GLD[,4]
> head(GLD, n=2)
           GLD.Close
2007-01-03     62.28
2007-01-04     61.65
> tues <- weekdays(time(GLD)) == "Tuesday"
> gold <- merge(GLD, tues)
> head(gold, n=5)
           GLD.Close tues
2007-01-03     62.28    0
2007-01-04     61.65    0
2007-01-05     60.17    0
2007-01-08     60.48    0
2007-01-09     60.85    1

person Milktrader    schedule 28.03.2011    source источник


Ответы (2)


Как насчет этого (на основе фиктивного фрейма данных от Alaiacano).

corn$tuesdays <- weekdays(corn$dates) == "Tuesday"

# count days from any partial week at the beginning
start_len <- ifelse(corn$tuesdays[1], 0, rle(corn$tuesdays)$lengths[1])

# assign a week value to every row
corn$week <- c(rep(0, start_len), 1 + seq_len(nrow(corn) - start_len) %/% 7)

# concatenate the start date of the first (possibly incomplete) week
# to the start dates for all the following weeks
week_starts <- as.Date(corn$dates[corn$tuesdays])
if(start_len > 0) week_starts <- c(week_starts[1] - 7, week_starts) 

# calculate weekly means and assemble to a data frame
corn_values <- aggregate(value~week, data = corn, FUN = mean)$value
corn_weekly <- data.frame(week_starts, corn_values)
person J. Win.    schedule 28.03.2011
comment
Я включил часть вашего решения выше с воспроизводимым кодом. - person Milktrader; 29.03.2011
comment
После того, как я заменил даты кукурузы на время (кукуруза), я заставил это работать до расчета еженедельных средних значений, но это проблемы, характерные для моих данных. Он работает на фиктивных данных. Нет значений параметров, которые нужно передать to.weekly или какой-либо подобной функции, чтобы неделя начиналась во вторник, поэтому необходимы эти дополнительные шаги. Спасибо. - person Milktrader; 31.03.2011

Может быть более элегантное решение, но это должно помочь

# generate some fake data for 2011
corn <- data.frame(dates=as.Date("2011-01-01") + seq(0,365), value=runif(366))

# get the day of week
corn$dow <- chron::day.of.week(as.numeric(strftime(corn$dates, "%Y")),
                               as.numeric(strftime(corn$dates, "%m")),
                               as.numeric(strftime(corn$dates, "%d")))
# take subset     
corn <- subset(corn, dow==2)

Вывод выглядит следующим образом:

> head(corn)
        dates      value dow
11 2011-01-11 0.54688767   2
17 2011-01-17 0.22249506   2
22 2011-01-22 0.61725913   2
28 2011-01-28 0.45681763   2
36 2011-02-05 0.77839486   2
41 2011-02-10 0.07201445   2

Вы можете отказаться от дня недели и/или использовать row.names вместо corn$dates.

person alaiacano    schedule 28.03.2011
comment
генерирует кучу NA на моих данных и кажется неустойчивым (не каждые семь дней) на фиктивных данных. - person Milktrader; 29.03.2011
comment
Боюсь, я попробовал ваше решение на data.frame, который у меня был в моей среде с тем же именем. Мой вопрос к зоопарку, объекту xts, поэтому я неправильно написал, когда заявил, что ваше решение дало кучу NA. Переменная corn$dates не существует. Однако вы можете использовать время (кукурузу), чтобы получить переменную даты. - person Milktrader; 29.03.2011