使用多个变量过滤多次出现的记录

the*_*ide 3 r dplyr

我有一个样本数据集。我的目标是保留所有user_id 其记录plan_id不止一次的记录。据了解,您可以使用

n_occur <- data.frame(table(test$user_id))
Run Code Online (Sandbox Code Playgroud)

但是,如何计算两列变量的出现频率,然后用多次出现的变量过滤原始数据集呢?例如,这是我的测试数据集:

> test
   user_id plan_id hour
1        1      10    2
2        2      10    4
3        3      20   23
4        4      20   12
5        5      10    8
6        1      10   10
7        5      20    6
8        1      20    5
9        1      20   18
10       5      10    7
11       1      30    6
Run Code Online (Sandbox Code Playgroud)

这是预期的输出:

> output
  user_id plan_id hour
1       1      10    2
2       5      10    8
3       1      10   10
4       1      20    5
5       1      20    8
6       5      10   17
Run Code Online (Sandbox Code Playgroud)

和数据:

> dput(test)
structure(list(user_id = c(1, 2, 3, 4, 5, 1, 5, 1, 1, 5, 1), 
    plan_id = c(10, 10, 20, 20, 10, 10, 20, 20, 20, 10, 30), 
    hour = c(2, 4, 23, 12, 8, 10, 6, 5, 18, 7, 6)), .Names = c("user_id", 
"plan_id", "hour"), row.names = c(NA, 11L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)

任何建议,将不胜感激!

Psi*_*dom 5

您可以使用duplicated来检查id列的开头和结尾,如果任一列返回TRUE,则该行出现多次;然后,您可以使用返回的逻辑向量来子集数据帧:

ids <- df[c('user_id', 'plan_id')]
df[duplicated(ids) | duplicated(ids, fromLast = TRUE),]

#   user_id plan_id hour
#1        1      10    2
#5        5      10    8
#6        1      10   10
#8        1      20    5
#9        1      20   18
#10       5      10    7
Run Code Online (Sandbox Code Playgroud)