首页 > 解决方案 > R中的数据整理和创建时间线

问题描述

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

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

标签: r

解决方案


您可以排列数据namedate标记第一个和第二个(结束)记录。最后,加入状态+为的数据-

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)

推荐阅读