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

时间:2020-05-17 18:13:42

标签: r date lubridate

我有一个日期列表(mm / dd / yyyy)和相关的星期几,其中每个日期代表对事件的观察(见下文)。

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循环来循环显示星期,但是不确定不确定如何在不手动创建星期几的第三列的情况下保持每周分开的最佳方法。

我查找了其他类似的帖子(How to divide db dates into weeks?Convert dates into weeks等),但没有找到针对该特定问题的答案。我也已经阅读了lubridate软件包的功能,但是再次不确定它是否可以满足这些特定需求。

谢谢!

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。如果您在情节中发现异常行为,请查找这些值,如果找到了这些值,则可能需要研究解决这些细微差异的方法,以保持工作日的顺序。

答案 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()

reprex package(v0.3.0)于2020-05-17创建

答案 2 :(得分: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")