我有一个这样的数据框:
> 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。有什么代码可以解决这个问题吗?
非常感谢!
答案 0 :(得分:0)
想法:
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))
rowSums(!between(ratio_da[,5:7], 0.83, 1.2)) > 0
(这里没有多少节省)