我有一个数据集,其中包含这两个变量:
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中。我真的很感激任何建议这该怎么做。谢谢!
答案 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)
这基于以下表命令的输出:
> 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。