如何同时根据大于或小于条件过滤或子集多个列?

时间:2021-03-19 03:01:11

标签: r

我有一个这样的数据框:

> head(ratio_da)
               Compound       PA1       PA2         PA3 PA1 : PA2 PA1 : PA3 PA2 : PA3
1 7.92_540.535223166667   3720068  42061995  22440957.7 0.0884425 0.1657714 1.8743405
2 7.64_538.520408833333 150348486 247654259 299620639.3 0.6070902 0.5017962 0.8265594
3 6.73_552.499681833333   2687581   5690404    869171.9 0.4723006 3.0921170 6.5469255
4      6.12_536.5044875  16289397  21130472  21314675.4 0.7708961 0.7642339 0.9913579
5 8.22_566.551271833333  24241911  49978630  48028396.5 0.4850455 0.5047412 1.0406059
6 8.64_594.582882166667   8772965  16609306  16694017.1 0.5281958 0.5255155 0.9949257

如您所见,最后三列是列 PA1、PA2 和 PA3 的比率。我想按以下条件过滤所有比率列:>= 1.2 | <= 0.83。我通常使用这个代码:

test <- filter(ratio_da, ratio_da$`PA1 : PA2` >= 1.2, ratio_da$`PA1 : PA2` >= 0.83 | ratio_da$`PA1 : PA3` >= 1.2, ratio_da$`PA1 : PA3` >= 0.83 |ratio_da$`PA2 : PA3` >= 1.2, ratio_da$`PA2 : PA3` >= 0.83 )

由于我有大量这样的数据帧,我试图找到一种更快的方法来适应每个输入数据帧。所以我尝试了apply()

t <- tt[apply(tt[5:7],1,function(x) any(x >=1.2 | x <= 0.83)),]

...但这并没有同时过滤所有 raios。有什么代码可以解决这个问题吗?

非常感谢!

1 个答案:

答案 0 :(得分:0)

想法:

基础 R

rowSums(ratio_da[,5:7] >= 1.2 | ratio_da[,5:7] <= 0.83) > 0
# [1] TRUE TRUE TRUE TRUE TRUE TRUE

或效率较低:

Reduce(`|`, lapply(ratio_da[,5:7], function(z) z >= 1.2 | z <= 0.83))

dplyr

rowSums(!between(ratio_da[,5:7], 0.83, 1.2)) > 0

(这里没有多少节省)