R 通过某些变量在两个不同的数据帧分组中查找两个集合的连接
我有两个数据帧: setA:R 通过某些变量在两个不同的数据帧分组中查找两个集合的连接,r,dplyr,plyr,R,Dplyr,Plyr,我有两个数据帧: setA: session_id datetime request <int> <dttm> <dbl> 1 1105 2016-03-09 00:33:42 8 2 1105 2016-03-09 00:33:43 3 3 1107 2016-03-09 00:44:24 14 4
session_id datetime request
<int> <dttm> <dbl>
1 1105 2016-03-09 00:33:42 8
2 1105 2016-03-09 00:33:43 3
3 1107 2016-03-09 00:44:24 14
4 1107 2016-03-09 00:44:26 14
5 1108 2016-03-09 00:54:02 9
6 1108 2016-03-09 00:54:04 10
7 1109 2016-03-09 01:01:37 17
8 1109 2016-03-09 01:01:39 6
9 1110 2016-03-09 01:02:49 10
10 1110 2016-03-09 01:02:49 8
session_id datetime request
<int> <dttm> <dbl>
1 1105 2016-03-09 00:33:45 3
2 1107 2016-03-09 00:44:29 7
3 1108 2016-03-09 00:54:06 10
4 1109 2016-03-09 01:01:40 6
5 1110 2016-03-09 01:02:51 5
6 1111 2016-03-09 01:18:36 14
7 1111 2016-03-09 01:18:38 16
8 1112 2016-03-09 01:21:20 1
9 1112 2016-03-09 01:21:21 19
10 1114 2016-03-09 01:29:58 13
…但按sessionid分组
我希望你能明白。我想你可以做到:
library(dplyr)
setA %>%
inner_join(setB, by = c("session_id", "request"))
这将导致数据帧的合并,其中会话id和请求在两个数据集中相同,从而丢弃日期时间
session_id request datetime.x datetime.y
1 1105 3 2016-03-09 00:33:43 2016-03-09 00:33:45
2 1108 10 2016-03-09 00:54:04 2016-03-09 00:54:06
3 1109 6 2016-03-09 01:01:39 2016-03-09 01:01:40
更新:如果添加此项,将获得交点的长度:
setA %>%
inner_join(setB, by = c("session_id", "request")) %>%
group_by(session_id) %>%
summarise(lengthintersection = n())
session_id lengthintersection
<int> <int>
1 1105 1
2 1108 1
3 1109 1
setA%>%
内部连接(setB,by=c(“会话id”,“请求”))%>%
分组人(会话id)%>%
摘要(lengthintersection=n())
会话id长度间隔
1 1105 1
2 1108 1
3 1109 1
更新:作为对评论的回应,另一次更新用于计算比例:
setA %>%
group_by(session_id) %>%
mutate(numberrequests = n()) %>%
inner_join(setB, by = c("session_id", "request")) %>%
summarise(proportion = n()/numberrequests)
# A tibble: 3 x 2
session_id proportion
<int> <dbl>
1 1105 0.5
2 1108 0.5
3 1109 0.5
setA%>%
分组人(会话id)%>%
变异(numberrequests=n())%>%
内部连接(setB,by=c(“会话id”,“请求”))%>%
总结(比例=n()/数量请求)
#一个tibble:3x2
会话id比例
1 1105 0.5
2 1108 0.5
3 1109 0.5
我建议使用awesome data.table包,因为对于许多任务,它比dplyr更快
我稍微修改了示例,这样就有一个长度大于1的交点
library(data.table)
A <- data.table("session_id" = c(1105, 1105, 1107 ,1107 ,1108, 1108, 1120),
"request" = c(8,3,14,15,9,10, 20))
B <- data.table("session_id" = c(1105, 1107, 1107, 1108, 1109, 1110, 1111),
"request" = c(3, 15, 14, 9, 6, 5, 9))
PS:以后,请添加一些代码来创建示例data.frames,这样人们就不必手动键入表格。您可以指定输出吗?您要求使用
交叉点
,但您给出的示例的日期时间
不同。是否要丢弃datetime
?或者你要求合并?放弃datetime,我想根据请求确定交叉点的长度。好的,把这个长度间隔除以setA的长度对应的SessionID长度(即1105案例中的2)…我会标记为答案谢谢。上帝保佑你,LenI不确定你的意思。您想知道setA中的请求在SETB中也占多大比例,按sessionID分组吗?所以对于1105,它应该评估为0.5?是的,你得到了。
library(data.table)
A <- data.table("session_id" = c(1105, 1105, 1107 ,1107 ,1108, 1108, 1120),
"request" = c(8,3,14,15,9,10, 20))
B <- data.table("session_id" = c(1105, 1107, 1107, 1108, 1109, 1110, 1111),
"request" = c(3, 15, 14, 9, 6, 5, 9))
C <- merge(A,B, all.x = T, by = "session_id")
C[, len_inter := length(intersect(request.x, request.y)), by=session_id]
A[C, len_inter := i.len_inter, on="session_id"]
> A
session_id request len_inter
1: 1105 8 1
2: 1105 3 1
3: 1107 14 2
4: 1107 15 2
5: 1108 9 1
6: 1108 10 1
7: 1120 20 0