【发布时间】:2016-11-07 19:46:19
【问题描述】:
我有一个名为 test 的数据框,如下所示:
> test
dx1 dx2 dx3
1 659 658 657
2 653 651 690
3 249 786 654
4 647 655 656
5 900 654 658
6 800 224 104
我只想保留至少有一列在 650 - 660 范围内的观察值,包括 650 - 660。在这种情况下,结果应如下所示:
dx1 dx2 dx3
1 659 658 657
2 653 651 690
3 249 786 654
4 647 655 656
5 900 654 658
到目前为止,我已经尝试过使用test[test %in% c(650 : 660)],但这会返回test 中满足范围而不维护数据帧结构的数字列表。如何将范围条件应用于数据框中的多个列?
【问题讨论】:
-
这里有一个使用
rowSums的方法:test[rowSums(test > 649 & test < 661) > 0,]。 -
这是另一个(不必要地过于复杂)可能的解决方案
library(data.table) ; setDT(test)[, .SD[Reduce(`|`, lapply(.SD, between, 650, 660))]] -
基地
R的另一种方式:test[apply(test,1,function(x) any(x>=650 &x<=660)),] -
@lmo 如果您不忙于寻找欺骗行为,您可以发布该内容。另一种选择是
as.logical而不是> 0。 -
谢谢@Frank。如果不是彻头彻尾的欺骗,也存在类似的问题,但我目前找不到一个很好的例子。