Изменить данные на основе разных столбцов - PullRequest
0 голосов
/ 07 февраля 2019

Мне нужно изменить свои данные, чтобы получить их в надлежащем формате для Survival Analysis.

Мой текущий набор данных выглядит следующим образом:

Product_Number            Date         Status 
     A                  2018-01-01        0
     A                  2018-01-02        1
     A                  2018-01-03        0
     B                  2018-01-01        0
     B                  2018-01-02        0
     B                  2018-01-03        0
     B                  2018-01-04        1
     C                  2018-01-01        0
     C                  2018-01-02        0

Мне нужно изменить свои данные на основе столбцов Product_Number, Date и Status (я хочу подсчитать количество дней для каждого продукта, пока статус не изменится на 1. Если статус равен 0, процесс должен начаться заново).

Итак, данные должны выглядеть так:

Product_Number    Number_of_Days    Status 
       A                2             1    #Two days til status = 1
       A                1             0    #One day, status = 0 (no end date yet) 
       B                4             1    #Four days til status = 1
       C                2             0    #Two days, status is still 0 (no end date yet)

Что я пробовал до сих пор?

Я упорядочил свои данные по ProductNumber и Date.Мне нравится способ DPLYR, поэтому я использовал:

df <- df %>% group_by(Product_Number, Date)   # note: my data is now in the form as in the example above. 

Затем я попытался использовать функцию diff (), чтобы увидеть разницу в датах (подсчитать количество дней).Но мне не удалось «остановить» отсчет, когда статус поменялся (с 0 на 1 и наоборот).

Надеюсь, я четко объяснил проблему.Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Вы можете сделать:

library(dplyr)

df %>%
  group_by(Product_Number) %>%
  mutate(Date = as.Date(Date),
         group = cumsum(coalesce(as.numeric(lag(Status) == 1 & Status == 0), 1))) %>%
  group_by(Product_Number, group) %>%
  mutate(Number_of_Days = (last(Date) - first(Date)) + 1) %>%
  slice(n()) %>% ungroup() %>%
  select(-group, -Date)

Вывод:

# A tibble: 4 x 3
  Product_Number Status Number_of_Days
  <chr>           <int> <time>        
1 A                   1 2             
2 A                   0 1             
3 B                   1 4             
4 C                   0 2     
0 голосов
/ 07 февраля 2019

Это может быть то, что вы ищете, если я правильно понял ваш вопрос.

library(dplyr)

df %>%
  mutate(Number_of_Days=1) %>%
  select(-Date) %>%
  group_by(Product_Number, Status) %>%
  summarise_all(sum,na.rm=T)

  Product_Number Status Number_of_Days
1 A                   0              2
2 A                   1              1
3 B                   0              3
4 B                   1              1
5 C                   0              2
...