我有一个具有ID列和数字列的数据框。我想测试每个数字列是否等于某个值,如果不是,则输出不等于该值的列。
> df
Source: local data frame [6 x 10]
id c1 c2 c3 c4 c5 c6 c7 c8 c9
(int) (int) (int) (int) (int) (int) (int) (int) (int) (int)
1 1 1 1 1 1 1 1 1 1 4
2 2 1 1 1 1 1 1 1 1 1
3 3 1 1 1 1 1 1 1 1 1
4 4 1 2 1 1 1 1 1 1 1
5 5 1 1 1 1 1 1 1 1 1
6 6 1 1 1 1 2 1 1 1 1
有没有办法在dplyr中执行此操作?我可以通过测试每个列来进行过滤,但是寻找一种简单的方法。
library(dplyr)
filter(df, c1 == 1, c2 == 1, c3 == 1, c4 == 1, c5 == 1, c6 == 1, c7 == 1, c8 == 1, c9 ==1)
我正在寻找一种不需要我枚举每个列名的解决方案。
当我翻转条件以找到至少有一个不相等的行(如下所示)时,我仍然需要测试每一列以查看哪一行不等于'到指定的值。太麻烦了。
filter(df, c1 > 1 | c2 > 1 | c2 > 1
| c4 > 1 | c5 > 1 | c6 > 1 | c7 > 1 | c8 > 1 | c9 > 1)
答案 0 :(得分:2)
假设您想要的输出是第二个过滤器代码生成的输出,我会这样做。
df[rowSums(df[-1]) != ncol(df[-1]), ]
# id c1 c2 c3 c4 c5 c6 c7 c8 c9
#1 1 1 1 1 1 1 1 1 1 4
#4 4 1 2 1 1 1 1 1 1 1
#6 6 1 1 1 1 2 1 1 1 1
rowSums(df[-1]) != ncol(df[-1])
生成逻辑向量。对于每一行,您总结了数字。由于您的目标值为1
,如果所有列都为1,则总数应等于列数。使用此检查,您可以按df[rowSums(df[-1]) != ncol(df[-1]), ]
对行进行子集化。我希望这就是你所追求的。