【问题标题】:Filter_all with differing condition for each column每列具有不同条件的 Filter_all
【发布时间】:2018-07-26 07:32:56
【问题描述】:

我有以下向量

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 以便输出包含 df 的行,在每一列中,最小值将是 vec1 - 0.05 的对应值,最大值将是 @987654326 @。

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

我确信这可以通过 filter_all(.) 来完成,类似于

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

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

【问题讨论】:

    标签: r filter dplyr


    【解决方案1】:

    我们可以在数据帧上使用 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 
    

    【讨论】:

    • rowSums(df &gt; (vec1[col(df)] - 0.05) &amp; df &lt; (vec1[col(df)] + 0.05)) == ncol(df)
    猜你喜欢
    • 2021-09-09
    • 2016-03-10
    • 2018-05-17
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 2022-08-13
    • 2022-10-14
    • 2011-05-08
    相关资源
    最近更新 更多