R中相同ID的多个事件的时间差异

时间:2017-10-31 21:26:40

标签: r dplyr

我是Stackoverflow的新手并查看了类似的帖子,但无法找到可以从相同ID 中捕捉多个事件的时差的解决方案>。

我得到了什么:

Time<-c('2016-10-04','2016-10-18', '2016-10-04','2016-10-18','2016-10-19','2016-10-28','2016-10-04','2016-10-19','2016-10-21','2016-10-22', '2017-01-02', '2017-03-04')
Value<-c(0,1,0,1,0,0,0,1,0,1,1,0)
StoreID<-c('a','a','b','b','c','c','d','d','a','a','d','c')
Unit<-c(1,1,2,2,5,5,6,6,1,1,6,5)
Helper<-c('a1','a1','b2','b2','c5','c5','d6','d6','a1','a1','d6','c5')

帮助列是StoreID和Unit的组合,因为我无法弄清楚如何按商店ID和单元进行分组。我想对数据进行排序,以显示何时禁用单位(值= 0)并再次启用(值= 1)。

最终,我想要:

    Store_ID  Unit    Helper    Time(v=0)      Time(v=1)       Time2(v=0)    Time 2(v=1)
     a         1       a1      2016-10-04    2016-10-18      2016-10-21 2016-10-22
     b         2       b2      2016-10-04    2016-10-18 
     c         5       c5      2016-10-19    2016-10-28      2017-03-04
     d         6       d6      2016-10-04    2017-10-19

有什么想法吗?

我在dplyr中思考一些事情,但我很难知道该往哪里走得更远。

1 个答案:

答案 0 :(得分:1)

创建一个标题列,其中包含 Value 列和区分重复项的行号,然后spread为宽格式:

未使用 帮助 列,而是按照StoredID和Unit分组。

df <- data.frame(StoreID, Unit, Time, Value)

df %>% 
    group_by(StoreID, Unit, Value) %>% 
    mutate(Headers = sprintf('Time %s (v=%s)', row_number(), Value)) %>% 
    ungroup() %>% select(-Value) %>% 
    spread(Headers, Time)

# A tibble: 4 x 7
#  StoreID  Unit `Time 1 (v=0)` `Time 1 (v=1)` `Time 2 (v=0)` `Time 2 (v=1)` `Time 3 (v=0)`
#*  <fctr> <dbl>         <fctr>         <fctr>         <fctr>         <fctr>         <fctr>
#1       a     1     2016-10-04     2016-10-18     2016-10-21     2016-10-22             NA
#2       b     2     2016-10-04     2016-10-18             NA             NA             NA
#3       c     5     2016-10-19             NA     2016-10-28             NA     2017-03-04
#4       d     6     2016-10-04     2016-10-19             NA     2017-01-02             NA