R-按组合条件过滤数据
让我们查看以下代码:R-按组合条件过滤数据,r,dataframe,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 <- 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:
中只有0(一个或多个),则保持该状态
中有0(一个或多个)和1,则删除所有单击了0的行(单击的中有1的行仍保留)
中有多行有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
我保留了原始的行索引。这里有一个使用拆分-应用-合并方法的基本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
您可以按两列进行拆分,如
split(df,list(df$u_id,df$i_id))
并避免使用额外的列感谢您指出这一点,@Sotos。我将进行编辑以合并。您还可以使用by
返回dfs列表:by(df,df[c(“u\u id”,“I\u id”)],FUN=…
(不需要lappy
)。
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