Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-按组合条件过滤数据_R_Dataframe - Fatal编程技术网

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,则只保留一行(第一行或任何一行)
  • 如果单击中有0(一个或多个)和多行1,则删除所有0行,并仅保留一行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