Как извлечь количество дней недели из вектора в R

У меня есть набор данных из исторических цен акций для публично торгуемых компаний на NASDAQ и NYSE. Я использовал следующий код для загрузки данных о цене акций Amazon и получения времени выборки данных.

library(quantmod)
amzn <- getSymbols("AMZN",auto.assign=FALSE)
sampleTimes <- index(amzn)

Затем я использовал grepl для подсчета того, сколько значений было собрано в 2012 году. Теперь мне нужно подсчитать, сколько из этих значений произошло по понедельникам.

Я пробовал несколько разных подходов, но ни один не был эффективным. Я думаю, что пакет lubridate должен быть полезен, но я не могу понять, как именно. POSIXlt также должен быть полезным, но я также не могу придумать эффективный способ его использования.

Это, должно быть, очень простая проблема, но я не могу обернуть это вокруг себя.

Пожалуйста помоги.

3 ответа

Я думаю, что это то, что вы после:

table(weekdays(sampleTimes))

##    Friday    Monday  Thursday   Tuesday Wednesday 
##       373       350       376       381       382

Редактировать согласно комментариям ОП:

do.call(rbind, lapply(split(sampleTimes, substring(sampleTimes, 1, 4)), function(x) {
    table(weekdays(x))
}))

##      Friday Monday Thursday Tuesday Wednesday
## 2007     51     48       51      50        51
## 2008     50     48       50      52        53
## 2009     49     48       51      52        52
## 2010     50     47       51      52        52
## 2011     51     46       51      52        52
## 2012     51     47       51      50        51
## 2013     51     48       50      52        51
## 2014     20     18       21      21        20

Просто используйте weekdays(.) == "Monday" в качестве логического индекса в sampleTimes и добавить требование, чтобы они были в 2012 году:

 head( sampleTimes[ weekdays(sampleTimes)=="Monday"] )
[1] "2007-01-08" "2007-01-22" "2007-01-29" "2007-02-05" "2007-02-12" "2007-02-26"

> head( sampleTimes[ weekdays(sampleTimes)=="Monday" & substr(sampleTimes, 1,4)=="2012"] )
[1] "2012-01-09" "2012-01-23" "2012-01-30" "2012-02-06" "2012-02-13" "2012-02-27"

Вы можете просто достичь этого, используя пакет lubridate, как показано ниже:

Изменить: заменить nrow() на length()

> library(lubridate)
> sampleTimes <- ymd(sampleTimes)
> length(subset(sampleTimes, year(sampleTimes) == 2012 & wday(sampleTimes, label=T) == "Mon"))
[1] 47
Другие вопросы по тегам