Filter_all每列的条件不同

时间:2018-07-26 07:32:57

标签: r filter dplyr

我有以下向量

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的对应值,并且最大值为vec1 + 0.05

因此,在此示例中,仅前4行满足此条件(在x中,我基于-0.049 to 0.501的第一个条目允许vec1,在y中,我允许根据第二个条目从00.1,依此类推。

我确信可以使用filter_all(.)来完成此操作,类似

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

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

1 个答案:

答案 0 :(得分:2)

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