dplyr:测试是否每个列都等于某个值,并且输出列不相等

dplyr:测试是否每个列都等于某个值,并且输出列不相等,r,dplyr,R,Dplyr,我有一个数据框,它有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

我有一个数据框,它有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中实现?我可以通过测试每一列来使用filter,但要寻找一种简单的方法

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)

假设您期望的输出是第二个过滤器代码生成的输出,我将执行以下操作

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

行和(df[-1])!=ncol(df[-1])
生成一个逻辑向量。对于每一行,您将对数字进行求和。由于目标值为
1
,如果所有列都有1,则总数应等于列数。使用此检查,您可以通过
df[rowsumes(df[-1])!=ncol(df[-1]),]来子集行。我希望这就是你想要的。

为什么必须是“dplyr”?为什么不干脆
哪个
?我有点困惑。似乎您希望检查每个带有数字的列是否具有相同的值(即1)。如果是这种情况,我会做
df[,sapply(df,function(x){any(x!=1)})]
。但是,当我运行您的
过滤器
代码时,您选择了包含
1
的所有行。我想知道你是指行而不是列。是的,这也是一个用例。它可以被翻转到没有一个是零。我正在寻找一个解决方案,不需要我枚举每个列名。这是一个非常有趣的解决方案。没有想到在一个分组案件中使用sapply。虽然在我的例子中,ID列永远不会等于单个值。所以,这不太管用。你能澄清一下你所说的
是什么意思吗?尽管在我的例子中,ID列永远不会等于一个值?再帮我一个忙。您能向所有用户显示您想要的输出吗?这将帮助我们所有人。