2015-10-04 31 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]), ]。我希望這是你以後的樣子。

相關問題