在R中查找具有相同session_id的不同user_id

时间:2014-11-01 00:40:39

标签: r

我有一个数据集,其中包含这两个变量:

user_id <- c(1, 1, 1, 2, 3, 4, 1, 2, 2, 2, 4, 5, 6, 7, 3)
session_id <- c("a", "a", "b", "c", "d", "a", "a", "b", "b", "c", "e", "f", "g", "h", "d")

这是我的问题:user_id可以采用不同的session_id值,但是特定的session_id,即使重复,也只能属于一个user_id。例如,user_id 1可以有许多session_id,如a,b和c,但我想知道这些相同的session_ids(a,b,c)是否也出现在其他不是1的user_ids中。我真的很感激任何建议这该怎么做。谢谢!

4 个答案:

答案 0 :(得分:3)

data.table

library(data.table)
dt = data.table(user_id, session_id)
ans = unique(dt)[, .(user_id=user_id[.N > 1]), by=session_id]
#    session_id user_id
# 1:          a       1
# 2:          a       4
# 3:          b       1
# 4:          b       2

我们首先计算删除相同unique(dt)组合的user_id, session_id,然后按session_id进行分组,对于每个组,我们返回user_id iff中的观察数量那个群体是> 1.这是通过使用.N一个特殊变量来完成的,该变量保存每个组的观察数量。

如果你只想要session_id有多个user_id,那么你可以这样做:

unique(dt)[, .(N=.N > 1L), by=session_id][(N), session_id]
# [1] "a" "b"

这里,在计算unique(dt)之后,我们询问观察的数量是否>一个,对于每个组,并返回一个TRUE / FALSE列N。然后,我们只返回所有session_id值的TRUE

答案 1 :(得分:0)

例如,您可以使用tapply执行此操作。您按会话对用户的ID进行分组,并为每个ID组检查它是否包含多个用户ID。

res <- 
tapply(user_id,session_id,
       function(x)if(length(unique(x))>1)unique(x) else NA)
## remove missing values
res[!is.na(res)]

$a
[1] 1 4

$b
[1] 1 2

答案 2 :(得分:0)

一种可能的dplyr方法:

library(dplyr)

data.frame(user_id, session_id) %>%
  group_by(session_id) %>%
  distinct(user_id) %>%
  filter(n() > 1) %>%
  arrange(session_id)

## Source: local data frame [4 x 2]
## Groups: session_id
## 
##   user_id session_id
## 1       1          a
## 2       4          a
## 3       1          b
## 4       2          b

答案 3 :(得分:0)

可以使用图形方法:

plot(table(user_id, session_id), col=1:10)

enter image description here

这基于以下表命令的输出:

> table(user_id, session_id)
       session_id
user_id a b c d e f g h
      1 3 1 0 0 0 0 0 0
      2 0 2 2 0 0 0 0 0
      3 0 0 0 2 0 0 0 0
      4 1 0 0 0 1 0 0 0
      5 0 0 0 0 0 1 0 0
      6 0 0 0 0 0 0 1 0
      7 0 0 0 0 0 0 0 1

只有'a'和'b'有多个与之关联的user_id。