2

我有一个数据集,其中包含有关个人随着时间的推移在哪里工作的信息,其中时间定义为年/月(并在我的数据集中显示为数值 YYYYMM)。我运行了一个 ggplot 来可视化个人在给定工作场所停留的时间以及他们如何四处走动。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 的工作历史。我如何考虑个人工作场所级别的每个连续序列从第一个月的第一天开始并在连续序列的最后一个月的最后一天结束。我还想将年/月变量从数字格式转换为日期格式,以使操作更容易。

PS:我在上一段中强调了每个连续的序列,因为同一个人可能会在给定的地方工作几个月,离开一段时间,然后稍后再回到同一个工作场所工作。在这些情况下,应分别考虑在该给定工作场所中个人工作的两个时间间隔。

4

1 回答 1

-1

关于将数字转换为日期类型的第二个问题,我得到了答案:

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])
于 2021-10-16T13:17:46.713 回答