让我们查看以下代码:
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:
clicked
中只有0(一个或多个),请将其保留。clicked
中的1,则删除所有点击0的行(clicked
中的1行仍然存在)clicked
中有多行包含1,则只保留一行(第一行或任何行)在应用了上述所有规则后,我们应该得到:
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
我离开了原始行索引。
答案 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