R - 按组合条件过滤数据

时间:2017-05-13 14:55:56

标签: r dataframe

让我们查看以下代码:

u_id <- c(1, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5)
i_id <- c(10, 10, 10, 12, 10, 11, 13, 13, 13, 10, 11, 13, 13, 14)
clicked <- c(0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1)

dframe <- data.frame(u_id, i_id, clicked)

创建以下数据框:

   u_id i_id clicked
1     1   10       0
2     1   10       1
3     1   10       1
4     1   12       1
5     2   10       0
6     2   11       1
7     3   13       0
8     3   13       0
9     3   13       1
10    4   10       0
11    4   11       1
12    5   13       0
13    5   13       0
14    5   14       1

我想以下列方式过滤数据:

对于相同的u_id,i_id:

  1. 如果clicked中只有0(一个或多个),请将其保留。
  2. 如果theres 0(一个或多个)和clicked中的1,则删除所有点击0的行(clicked中的1行仍然存在)
  3. 如果clicked中有多行包含1,则只保留一行(第一行或任何行)
  4. 如果单击中有0(一个或多个)和多行1,则删除所有0行并仅保留一行1(仍然无关紧要)
  5. 在应用了上述所有规则后,我们应该得到:

       u_id i_id clicked
    3     1   10       1
    4     1   12       1
    5     2   10       0
    6     2   11       1
    9     3   13       1
    10    4   10       0
    11    4   11       1
    12    5   13       0
    13    5   13       0
    14    5   14       1
    

    我离开了原始行索引。

1 个答案:

答案 0 :(得分:3)

以下是使用split-apply-combine方法在base R中的解决方案:

do.call(rbind, lapply(split(dframe, list(dframe$u_id, dframe$i_id)), function(i)

    if (sum(i$clicked) == 0) {

        i

    } else {

        i[i$clicked == 1,][1,]

}))

结果:

        u_id i_id clicked
1.10       1   10       1
2.10       2   10       0
4.10       4   10       0
2.11       2   11       1
4.11       4   11       1
1.12       1   12       1
3.13       3   13       1
5.13.12    5   13       0
5.13.13    5   13       0
5.14       5   14       1