我有以下向量
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
中,我允许根据第二个条目从0
到0.1
,依此类推。
我确信可以使用filter_all
和(.)
来完成此操作,类似
filter_all(df, all_vars(. >= (vec1(.) - 0.05) & . <= (vec1(.) + 0.05))))
但这不起作用。 我在做什么错了?
答案 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