Давайте предполагать, что у нас есть две даты, которые устанавливают ранг дней, например:
from.date <- as.Date('2018-03-01')
to.date <- as.Date('2018-03-31')
То, что мы хотим, он состоит в том, чтобы находить во все дни lunes
, martes
, miércoles
, etc
есть в вышеупомянутом интервале, выводе, сходном с этой:
lunes 4
martes 4
miércoles 4
jueves 5
viernes 5
sábado 5
domingo 4
Заметь: Эти данные соответствуй интервалу примера
Это одна funciГіn, что это делает, хотя что-то уродливое функционирует хорошо:
cdias<-function(from,to){
d<-c("lunes","martes","miércoles","jueves","viernes","sábado","domingo")
to<-as.Date(to)
from<-as.Date(from)
dif<-to-from
dias<-round((dif)/7)
drest<-dif-dias*7+1
w<-which(d==weekdays(from))
r<-rep(dias,7)
for(i in 1:drest){
if(w<=7){
r[w]<-r[w]+1
w<-w+1
}else{
w<-1
r[w]<-r[w]+1
w<-w+1
}
}
r<-as.data.frame(cbind(dias=d,n=r))
return(r)
}
cdias("2016-01-11","2018-01-24")
Простая форма, которая мне не нравится много, но несомненно эффективная, состоит в том, чтобы использовать "грубую силу" и производить все даты интервала и применять к каждой она funciГіn weekdays()
:
fechas <-data.frame(cant=seq(from = from.date, to = to.date, by = "days"))
fechas$wday <- factor(weekdays(fechas$cant), levels=weekdays(as.Date(4,"1970-01-01",tz="GMT")+0:6),ordered = TRUE)
aggregate(cant ~ wday, fechas, length)
Вывод:
wday cant
1 lunes 4
2 martes 4
3 miércoles 4
4 jueves 5
5 viernes 5
6 sábado 5
7 domingo 4
Комментариев:
Factor
, но упорядочены из-за dГ - в, но в существо имена, зависимые от языка, мы производим порядок начиная с одной недели, который мы знаем, начинается понедельник, levels=weekdays(as.Date(4,"1970-01-01",tz="GMT")+0:6)
, aggregate(cant ~ wday, fechas, length)
и считать происшествия library(lubridate)
library(dplyr)
fechas <- data.frame(cant = seq(
from = ymd(20180301),
to = ymd(20180331),
by = "days"))
fechas %>%
mutate(cant = weekdays(cant)) %>%
count(cant)
ВїPor quГ© lubridate::
? Потому что ymd()
и других сходных parsean prГЎcticamente любая вещь как дата.
ymd("2017enero20") == ymd(20170120)
ymd (170120) == ymd("2017-01-20") #
d<-weekdays(as.Date(4,"1970-01-01",tz="GMT")+0:6)
– Patricio Moracho 04.04.2018, 03:41