Как извлечь количество дней недели из вектора в 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