Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
dplyr:将会话中的事件分组在一起_R_Dplyr_Tidyr - Fatal编程技术网

dplyr:将会话中的事件分组在一起

dplyr:将会话中的事件分组在一起,r,dplyr,tidyr,R,Dplyr,Tidyr,我有一个数据框,如下所示。我想将每个独特会议的事件分组在一起。例如,在下面的示例中,id 1与我的系统进行了两次连接,并进行了两次会话。我想把数据传播出去,但每次都是这样。不是每个id。我如何使用dplyr和tidyr来执行此操作 > df id event time 1 1 start 2015-05-16 22:46:53 2 1 valid 2015-05-16 22:46:56 3 1 end 2015-05-16 22:46:59 4

我有一个数据框,如下所示。我想将每个独特会议的事件分组在一起。例如,在下面的示例中,id 1与我的系统进行了两次连接,并进行了两次会话。我想把数据传播出去,但每次都是这样。不是每个id。我如何使用dplyr和tidyr来执行此操作

> df
  id event                time
1  1 start 2015-05-16 22:46:53
2  1 valid 2015-05-16 22:46:56
3  1   end 2015-05-16 22:46:59
4  2 start 2015-05-16 22:46:53
5  2   bad 2015-05-16 22:47:00
6  1 start 2015-05-16 22:49:05
7  1   bad 2015-05-16 22:49:09
> 
所需的输出如下所示:

> df1
  nid           starttime           validtime             badtime             endtime
1   1 2015-05-16 22:46:53 2015-05-16 22:46:56                <NA> 2015-05-16 22:46:59
2   2 2015-05-16 22:46:53                <NA> 2015-05-16 22:47:00                <NA>
3   1 2015-05-16 22:49:05                <NA> 2015-05-16 22:49:09                <NA>

这里有一个方法。我不确定您是否有时间作为日期对象或字符对象。在这里,我在mydf中创建了时间作为日期对象。当我重塑数据时,我意识到spread将时间对象转换为数字。一、 因此,决定先将时间转换为字符。然后,我创建了一个名为group的新变量,该变量有助于通过spread重塑数据。为了维持你想要的秩序,我用了“安排”。我用select更改了列名。最后,我将时间转换为日期对象

library(dplyr)
library(tidyr)

mydf <- data.frame(id = c(1,1,1,2,2,1,1),
                   event = c("start", "valid", "end", "start", "bad", "start", "bad"),
                   time = as.POSIXct(c("2015-05-16 22:46:53", "2015-05-16 22:46:56", "2015-05-16 22:46:59",
                                       "2015-05-16 22:46:53", "2015-05-16 22:47:00", "2015-05-16 22:49:05",
                                       "2015-05-16 22:49:09"), format = "%Y-%m-%d %H:%M:%S"),
                   stringsAsFactors = FALSE)

mutate(mydf, time = as.character(time),
             group = cumsum(c(T, diff(id) != 0))) %>%
spread(event, time) %>%
arrange(group) %>%
select(id, starttime = start, validtime = valid, badtime = bad, endtime = end) %>%
mutate_each(funs(as.POSIXct(., format = "%Y-%m-%d %H:%M:%S")), starttime:endtime)

#  id           starttime           validtime             badtime             endtime
#1  1 2015-05-16 22:46:53 2015-05-16 22:46:56                <NA> 2015-05-16 22:46:59
#2  2 2015-05-16 22:46:53                <NA> 2015-05-16 22:47:00                <NA>
#3  1 2015-05-16 22:49:05                <NA> 2015-05-16 22:49:09                <NA>
使用data.table的选项。使用data.table的devel版本中的rleid和dcast,即安装are的v1.9.5指令,我们可以将“长”格式转换为“宽”格式

library(data.table)#v1.9.5+
dcast(setDT(df)[, gr:= rleid(id)], id+gr~paste0(event, 'time'), 
             value.var='time')[order(starttime)][, c(1, 5:6, 3:4), with=FALSE]
#   id           starttime           validtime             badtime
#1:  1 2015-05-16 22:46:53 2015-05-16 22:46:56                <NA>
#2:  2 2015-05-16 22:46:53                <NA> 2015-05-16 22:47:00
#3:  1 2015-05-16 22:49:05                <NA> 2015-05-16 22:49:09
#              endtime
#1: 2015-05-16 22:46:59
#2:                <NA>
#3:                <NA>
数据
df <- structure(list(id = c(1L, 1L, 1L, 2L, 2L, 1L, 1L),
 event =   c("start", 
"valid", "end", "start", "bad", "start", "bad"),
 time = structure(c(1431816413, 
 1431816416, 1431816419, 1431816413, 1431816420, 1431816545, 
 1431816549
  ), class = c("POSIXct", "POSIXt"), tzone = "%Y-%m-%d %H:%M:%S")), 
 .Names = c("id", 
 "event", "time"), row.names = c("1", "2", "3", "4", "5", "6", 
 "7"), class = "data.frame")