根据不同的列重塑数据

时间:2019-02-07 11:40:43

标签: r dplyr survival

我需要重塑数据,以正确的格式进行生存分析。

我当前的数据集如下:

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 :(得分:1)

如果我的问题正确的话,这可能就是您要寻找的东西。

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

答案 1 :(得分:1)

您可以这样做:

SELECT * FROM Users WHERE ID = 'foo' OR '1' = '1' ORDER BY created DESC

输出:

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)