R中的数据整理和创建时间线

时间:2018-05-28 12:43:46

标签: r

我无法在时间轴中绘制数据。我有3列数据。第一列是日期。第二列是“+”或“ - ”。 (“+”表示开始日期,“ - ”表示时间轴的结束日期)最后,第三列是事件的名称。仅供参考。这个数据非常长。

我猜第一步是为带有“+”的行创建第4列,并使用“ - ”填充行的“日期”列。然后用“ - ”删除行。然后我可以简单地使用timevis()命令。但我无法重塑数据。例如,对于事件A,有几个“+”和“ - ”。我无法将“ - ”行的日期复制到前一个“+”。

date     status name
01.01.2001  +   A
02.01.2001  +   B
02.01.2001  +   C
03.01.2001  -   B
04.01.2001  +   B
07.01.2001  -   A
09.01.2001  -   C
11.01.2001  +   A
13.01.2001  -   B

有没有办法在同一行上绘制没有开始和结束日期的时间轴?或者如何格式化数据,如下所示;

date     status name  enddate
01.01.2001  +   A   07.01.2001
02.01.2001  +   B   03.01.2001
02.01.2001  +   C   09.01.2001
04.01.2001  +   B   13.01.2001
11.01.2001  +   A   NA

1 个答案:

答案 0 :(得分:1)

您可以在namedate上排列数据,以标记第1和第2(结束)记录。最后,将状态为+-的数据加入:

library(dplyr)
library(lubridate)

df_mod <- df %>% mutate(date = dmy(date)) %>%
  group_by(name) %>%
  arrange(name, date) %>%
  mutate(discard = ifelse(row_number() == 1 & status=="-", TRUE, FALSE)) %>%
  filter(!discard) %>%  #discard if 1st row is "-".
  group_by(name)  %>%
  mutate(RecNo = ceiling(row_number()/2)) %>%
  select(-discard)


df_mod %>%
  filter(status=="+") %>%
  left_join(filter(df_mod, status == "-"), by=c("name","RecNo")) %>%
  arrange(date.x) %>%
  select(date = date.x, status = status.x, name, enddate = date.y, -RecNo, -status.y)

# # A tibble: 5 x 4
# # Groups: name [3]
#   date       status name  enddate   
#   <date>     <chr>  <chr> <date>    
# 1 2001-01-01 +      A     2001-01-07
# 2 2001-01-02 +      B     2001-01-03
# 3 2001-01-02 +      C     2001-01-09
# 4 2001-01-04 +      B     2001-01-13
# 5 2001-01-11 +      A     NA     

数据:

df <- read.table(text = 
"date     status name
01.01.2001  +   A
02.01.2001  +   B
02.01.2001  +   C
03.01.2001  -   B
04.01.2001  +   B
07.01.2001  -   A
09.01.2001  -   C
11.01.2001  +   A
13.01.2001  -   B",
stringsAsFactors = FALSE, header = TRUE)