代码之家  ›  专栏  ›  技术社区  ›  R overflow

根据不同的列重新调整数据形状

  •  0
  • R overflow  · 技术社区  · 6 年前

    我需要重塑我的数据,以获得一个适合生存分析的格式。

    我当前的数据集如下所示:

    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
    

    我需要根据产品编号、日期和状态(我想计算每个产品的天数,直到状态转换为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)
    

    到目前为止我试过什么?

    我按产品编号和日期订购了我的数据。我喜欢dpylr的方式,所以我使用:

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

    然后我尝试使用diff()函数来查看日期的差异(计算天数)。但我无法“停止”计数,当状态切换时(从0到1,反之亦然)。

    我希望我能清楚地解释这个问题。如果您需要其他信息,请告诉我。

    2 回复  |  直到 6 年前
        1
  •  1
  •   arg0naut91    6 年前

    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     
    
        2
  •  1
  •   alex_555    6 年前

    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
    
    推荐文章