我有一个数据集如下:
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上发帖求助,我无法弄清楚如何显示数据集,因此粘贴图片。对于给您带来的不便,我深表歉意。
答案 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