0
> log_df[1:10, ]
      tagid            happened status
1  03B2ACE7 2016-06-28 18:07:36   open
2  03B2ACE7 2016-06-28 18:36:15 closed
3  03B2ACE7 2016-06-29 07:29:59   open
4  03B2ACE7 2016-06-29 08:06:23 closed
5  03B2ACE7 2016-06-30 16:10:48   open
6  03B2ACE7 2016-06-30 17:23:55   open
7  03B2ACE7 2016-07-01 10:12:06 closed
8  03B2ACE7 2016-07-01 13:39:58 closed
9  03B2ACE7 2016-07-02 10:08:40   open
10 03B2ACE7 2016-07-02 13:33:01 closed
...

以上是我的数据。我想要制作的是:

      tagid                open               closed
1  03B2ACE7 2016-06-28 18:07:36  2016-06-28 18:36:15
2  03B2ACE7 2016-06-29 07:29:59  2016-06-29 08:06:23
3  03B2ACE7 2016-06-30 16:10:48  2016-07-01 10:12:06
...

我试图让它与 reshape2 包中的 dcast 一起工作。但是,我必须有选择性,我只拿起

“打开”是第一个,只有在关闭之后出现的那些,以及在打开之前出现的“关闭”。

所以从 log_df 开始,第 6 行和第 7 行将被忽略。

我真的被困住了,不知道该怎么做。也许 dcast 不是最好的方法?

请帮忙!太感谢了!

4

1 回答 1

1

使用dplyrand tidyr(来自 tidiverse,reshape 的演变):

library(dplyr)
library(tidyr)

df %>% 
    filter((status == 'open' & lag(status, default = "") != 'open') | (status == 'closed' & lead(status, default = "") != "closed")) %>% 
    mutate(r = ceiling(row_number() / 2)) %>% 
    spread(status, happened)

#>      tagid r              closed                open
#> 1 03B2ACE7 1 2016-06-28 18:36:15 2016-06-28 18:07:36
#> 2 03B2ACE7 2 2016-06-29 08:06:23 2016-06-29 07:29:59
#> 3 03B2ACE7 3 2016-07-01 13:39:58 2016-06-30 16:10:48
#> 4 03B2ACE7 4 2016-07-02 13:33:01 2016-07-02 10:08:40

它:

  1. 使用特定条件过滤 data.frame
  2. 添加一列来存储“组”
  3. 将值传播到列(相当于 dcast)

数据:

df <- read.table(text = '      tagid            happened status
1  03B2ACE7 "2016-06-28 18:07:36"   open
2  03B2ACE7 "2016-06-28 18:36:15" closed
3  03B2ACE7 "2016-06-29 07:29:59"   open
4  03B2ACE7 "2016-06-29 08:06:23" closed
5  03B2ACE7 "2016-06-30 16:10:48"   open
6  03B2ACE7 "2016-06-30 17:23:55"   open
7  03B2ACE7 "2016-07-01 10:12:06" closed
8  03B2ACE7 "2016-07-01 13:39:58" closed
9  03B2ACE7 "2016-07-02 10:08:40"   open
10 03B2ACE7 "2016-07-02 13:33:01" closed', h = T)
于 2017-05-31T22:08:30.233 回答