代码之家  ›  专栏  ›  技术社区  ›  Omry Atia

对每一列都用不同的条件过滤

  •  1
  • Omry Atia  · 技术社区  · 6 年前

    我有以下向量

    vec1 = c(0.001, 0.05, 0.003, 0.1)
    

    和一个数据帧

    df = data_frame( x = seq(0.001, 0.1, length.out = 10), y = seq(0.03, 0.07, length.out = 10), z = seq(0, 0.005, length.out = 10), w = seq(0.05, 0.25, length.out = 10))
    

    我想过滤 df 这样输出将包含 数据框 其中,在每一列中,最小值将是 vec1 - 0.05 最大的 vec1 + 0.05 .

    所以在这个例子中,只有前4行满足这个条件(in x 我允许 -0.049 to 0.501 基于 vec1 ,在 y 我允许 0 0.1 基于第二个条目,依此类推)。

    我相信这可以用 filter_all (.) ,大致是

    filter_all(df, all_vars(. >= (vec1(.) - 0.05) &  . <= (vec1(.) + 0.05))))
    

    但这不管用。 我做错什么了?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Ronak Shah    6 年前

    我们可以利用 mapply 在数据帧上,并将其与 vec1 并检查哪些值满足条件,然后仅选择所有列具有 TRUE 它的价值。

    df[rowSums(mapply(function(x, y) x > (y-0.05) & x < (y+0.05),
                                               df, vec1))  == ncol(df), ]
    
    #      x      y        z      w
    #   <dbl>  <dbl>    <dbl>  <dbl>
    #1 0.0120 0.0344 0.000556 0.0722
    #2 0.0230 0.0389 0.00111  0.0944
    #3 0.0340 0.0433 0.00167  0.117 
    #4 0.0450 0.0478 0.00222  0.139