我有一个数据集,其中包含有关个人工作时间的信息,其中时间定义为年/月(并在我的数据集中显示为数值YYYYMM)。我做了一个图表来可视化人们在一个特定的工作场所呆多久,以及他们是如何移动的。我使用position_dodge
使它在同一个人在同一个月内在多个地方工作时可见。
在下面的简单示例中:
- 个人A从2012年1月(即201201年)到2012年12月在1号位置工作
- 个人B从2012年1月到2012年6月在2号位置工作,然后从2012年7月到2012年11月切换到2号位置
- 个人C从2012年1月至2012年4月在1号位置工作,从2012年2月至2012年6月在2号位置工作
- 个人D只在2012年1月在1号地方工作
我的查询是关于如何使用时间间隔的。在我的数据集中,时间段变量指的是整个月。例如,个人A从2012年1月1日至2012年12月31日在工作地点1工作,个人D从2012年1月1日至2012年1月31日在工作地点1工作。
# individual A
a_id <- c(rep('A',12))
a_period <- c(seq(201201, 201212))
a_workplace <-c(rep(1,12))
# individual B
b_id <- c(rep('B',11))
b_period <- c(seq(201201,201206), seq(201207,201211))
b_workplace <-c(rep(1,6), rep(2,5))
# individual C
c_id <- c(rep('C',9))
c_period <- c(seq(201201,201204), seq(201202,201206))
c_workplace <-c(rep(1,4), rep(2,5))
# individual D
d_id <- c(rep('D',1))
d_period <- c(seq(201201,201201))
d_workplace <-c(rep(1,1))
# final data frame
id <- c(a_id, b_id, c_id, d_id)
period <- c(a_period, b_period, c_period, d_period)
workplace <- as.factor(c(a_workplace, b_workplace, c_workplace, d_workplace))
mydata <- data.frame(id, period, workplace)
ggplot(mydata, aes(x = id, y = period, color = workplace)) +
geom_line(position = position_dodge(width = 0.1), size = 2) +
scale_x_discrete(limits = rev) +
scale_y_continuous(breaks = seq(201201, 201212, by = 1)) +
coord_flip() +
theme(axis.text.x = element_text(angle=45, hjust=1),
legend.position = c(.8, .2),
legend.direction = "vertical",
legend.background = element_rect(linetype = "solid", colour = "black"),
panel.background = element_rect(fill = "grey97")) +
labs(y = "time", title = "Work affiliation")
上面的ggplot将年/月视为单个时间点。例如,它没有显示个人d的工作历史。我如何考虑个人工作场所层面的每个连续序列从第一个月的第一天开始?在连续序列的最后一个月的最后一天结束。我还想将年/月变量从数字格式转换为日期格式,以使操作更容易。
附注:我在上面段落中突出显示每个连续序列,因为同一个人可能在给定的地方工作几个月,离开一段时间,然后在同一工作场所再次返回工作。在这些情况下,在给定的工作场所中个人工作的两个时间间隔应该分开考虑。
第二个问题关于将数字转换为日期类型,我有一个答案:
library(lubridate) # handling and conversion of datetype
lubridate::ymd() # turns your numeric into a date
as.Date() #turns your characterstring into date type which is by the way the
#proper way you should handover timerelated data to ggplot
应该为您的代码做:
mydata$period=lubridate::ymd(mydata[,2])