Приведение в порядок данных и создание временной шкалы в R - PullRequest
0 голосов
/ 28 мая 2018

У меня проблемы с отображением данных на временной шкале.У меня есть 3 столбца данных.Первый столбец - это дата.Второй столбец - «+» или «-».(«+» обозначает дату начала, «-» обозначает дату окончания временной шкалы) И, наконец, третий столбец - это название события.К вашему сведению. Эти данные невероятно длинные.

Полагаю, первым шагом является создание 4-го столбца для строк с «+» и заполнение его столбцами «даты» строк с «-».Затем удалите строки с помощью «-».Тогда я могу просто использовать команду timevis ().Но я не мог изменить данные.Так, например, для события А есть несколько «+» и «-».Мне не удалось скопировать дату строки "-" в предыдущую букву "+".

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 голосов
/ 28 мая 2018

Вы можете расположить данные на name и date для отметки 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...