2015-10-04 26 views
0

我有一个具有ID列和数字列的数据框。我想测试每个数字列是否等于某个值,如果不是,则输出不等于该值的列。dplyr:测试每列是否等于某个值并且输出列不相等

> 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

为什么它必须是“dplyr”?为什么不只是“哪个”? – A5C1D2H2I1M1N2O1R2T1

+1

我有点困惑。看来你想检查每个带数字的列是否有相同的值(即1)。如果是这样的话,我会做'df [,sapply(df,function(x){any(x!= 1)})]''。但是,当我运行你的'filter'代码时,你选择了所有包含'1'的行。我想知道你是否意味着行而不是列。 – jazzurro

+0

是的,这也是一个用例。它可能翻转到没有一个是零。我正在寻找一种解决方案,不需要我列举每个列名称。 – Gopala

回答

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]), ]。我希望这是你以后的样子。

相关问题