如何根据R中出现的顺序从单个列创建对?

时间:2016-05-25 05:55:39

标签: r

我有一个数据集如下:

timestamp,session,event
5/23/2016 13:00,1,A
5/23/2016 13:20,1,B
5/23/2016 13:40,1,C
5/23/2016 14:00,2,B
5/23/2016 15:00,2,C
5/23/2016 15:20,3,B
5/23/2016 15:40,3,C
5/23/2016 16:00,3,D

我正在尝试在按时间戳排序的会话中构建有序的事件对。我的目标是为sankey图表构建数据输入,需要以下格式:

start,end,value
A,B,1
B,C,3
C,D,1

我还没弄清楚这一点。我可以考虑在sqldf中使用递归查询。但是想知道是否有更有效的方法来做到这一点。

对不起,这是我第一次在Stackoverflow上发帖求助,我无法弄清楚如何显示数据集,因此粘贴图片。对于给您带来的不便,我深表歉意。

2 个答案:

答案 0 :(得分:3)

我们可以尝试data.table

library(data.table)
d1 <- na.omit(setDT(df1)[order(as.POSIXct(timestamp, format = '%m/%d/%Y %H:%M'))
 ][, end := shift(event, type="lead"), session][])
d1[,.(value=.N) ,.(start=event, end)]
#   start end value
#1:     A   B     1
#2:     B   C     3
#3:     C   D     1

使用与dplyr

相同的方法
library(dplyr)
df1 %>% 
    arrange(as.POSIXct(timestamp, format = "%m/%d/%Y %H:%M")) %>% 
    group_by(session) %>%
    mutate(end = lead(event))  %>% 
    na.omit() %>%
    group_by(start=event, end) %>%
    summarise(value = n())
#     start   end value
#    <chr> <chr> <int>
#1     A     B     1
#2     B     C     3
#3     C     D     1

答案 1 :(得分:1)

使用dplyr

library(dplyr)
df <- cbind(dataset[1:nrow(dataset)-1,], dataset[2:nrow(dataset),])
names(df) <- c("timestamp1", "session1", "event1", "timestamp2", "session2", "event2")

> df %>% filter(session1==session2) %>% count(event1, event2)

Source: local data frame [4 x 3]
Groups: event1

  event1 event2 n
1      A      B 1
2      B      C 3
3      C      D 1