R 通过某些变量在两个不同的数据帧分组中查找两个集合的连接

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

我有两个数据帧:

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        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