我可以在R中创建一个for循环来将日历日期划分为唯一的周吗?

问题描述 投票:0回答:1

我有一个日期(mmddyyyy)和相关的星期的列表,其中每个日期代表一个事件的观测值(见下文)。

Date        DOTW
1/2/2019    Wednesday
1/5/2019    Saturday
1/15/2019   Tuesday
1/17/2019   Thursday
1/22/2019   Tuesday
1/25/2019   Friday
1/25/2019   Friday
2/4/2019    Monday
2/7/2019    Thursday

我想创建一个从周日开始的一周日(x轴)和y轴的观测次数(日期在列表中出现的次数)的图。该图最终会有多条线,日期范围内的每个星期都有一条。

我相信我需要创建一个for循环来循环周数,但不确定在不手动创建第三列周数的情况下保持每个周数分开的最佳方法。

我已经查找了其他类似的帖子(如何将db日期划分为周?, 将日期转换为星期等),但没有找到这个具体问题的答案。我也阅读了润滑包的功能,但同样不确定它是否能满足这些特定需求。

谢谢你!我有一份日期清单(mmddyy)。

r date lubridate
1个回答
0
投票

不知道这是否是你想要的...

已经做了一堆数据,因为你给的样本会使它相当难以解释线图,这是你所要求的。

library(lubridate)
library(dplyr)
library(ggplot2)


set.seed(123)

day_start <- "2019/01/01"
day_end <- "2019/01/31"

day_seq <- seq(as.Date(day_start), as.Date(day_end), by = "day")

df <-  
  data.frame(Date = sample(day_seq, 500, replace = TRUE)) %>% 
  mutate(Wk = week(Date),
         Dy = wday(Date, label = TRUE,  week_start = getOption("lubridate.week.start", 7))) %>% 
  group_by(Wk, Dy) %>% 
  summarise(Count = n())

ggplot(df, aes(Dy, Count, group = factor(Wk), colour = factor(Wk)))+
  geom_line()

创建于 2020-05-17 由 重读包 (v0.3.0)


0
投票

我认识到这不是一个线图,但以你提供的稀疏数据,如果不增加更多的列(如你说的你想避免的),线图是一个有点多的工作。

library(ggplot2)
ggplot(dat, aes(DOTW)) +
  geom_histogram(stat = "count") +
  facet_grid(format(Date, format = "%V") ~ .)
# Warning: Ignoring unknown parameters: binwidth, bins, pad

请看我下面的数据,我是如何确保一周的天数正确排序的.我不确定跳过周数是否有问题。(这是星期-年,所以如果你计划有不同的年份,也许多一点会是合适的,如 format="%Y-%B".)

by-week faceting of by-date counts


数据。

dat <- read.table(header = TRUE, stringsAsFactors = FALSE, text = "
Date        DOTW
1/2/2019    Wednesday
1/5/2019    Saturday
1/15/2019   Tuesday
1/17/2019   Thursday
1/22/2019   Tuesday
1/25/2019   Friday
1/25/2019   Friday
2/4/2019    Monday
2/7/2019    Thursday")

dat$Date <- as.Date(dat$Date, format = "%m/%d/%Y")
days <- Sys.Date() + 0:6
dat$DOTW <- factor(dat$DOTW, levels = format(days, format = "%A")[order(format(days, format = "%w"))])

如果任何数据发生在周日,该图将从周日开始。如果您喜欢以星期一为基础的星期,请将 "%w""%u". 另外顺便说一句:如果有任何 DOTW 值的拼写有任何不同,它将被替换为 NA. 如果你在你的图中看到异常行为,请寻找这些值,如果发现,你可能需要研究适应这些轻微差异的方法,以保留工作日的顺序。


0
投票

虽然不完全清楚你真正想要的是什么,但我已经用一些样本数据进行了尝试。

library(lubridate)
library(dplyr)
library(ggplot2)
# Create reprex-data
Date <- seq(as.Date("2020-01-01"),as.Date("2020-03-15"), by = "days"),
Sys.setlocale("LC_TIME", "English")
DOTW <- factor(weekdays(Date), levels = c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"), labels = c("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"))
Weeknum <- week(Date)
df <- data.frame(Date, DOTW, Weeknum)
df1 <- sample_n(df, size = 800, replace = T)


df_plot <- df1 %>%
  group_by(Weeknum, DOTW) %>%
  summarise(count = n())

df1 %>%
  group_by(Weeknum, DOTW) %>%
  summarise(count = n()) %>%
  filter(Weeknum <= 5) %>%
ggplot()+
  geom_line(aes(x = DOTW, y = count, group = Weeknum, colour = Weeknum))

在这里,我对数据进行了分组和总结,所以它计算了在一周内每个日期在每个工作日出现的次数。最后,将其绘制出来(为了便于阅读,我在这里将其过滤为5周)。

但是,从图形上看,这不是一个好的解决方案。可以考虑使用柱状图来代替,并且 facet_wrap 来分隔周数--例如:

df1 %>%
  group_by(Weeknum, DOTW) %>%
  summarise(count = n()) %>%
ggplot(aes(x = DOTW, y = count, fill = DOTW))+
  geom_col()+
  facet_wrap(~ Weeknum)+
  theme(axis.text.x = element_text(angle = 45), legend.position = "none")
© www.soinside.com 2019 - 2024. All rights reserved.