2017-06-19 66 views
0

這幾乎肯定是一個重複的問題,但我無法在SO上的任何地方找到答案。大多數其他類似的問題與一列中的子集相關,而不是整個數據框。r:刪除任何列中包含數字的行

我有一個數據幀:

test = data.frame(
'A' = c(.31562, .48845, .27828, -999), 
'B' = c(.5674, 5.7892, .4687, .1345), 
'C' = c(-999, .3145, .0641, -999)) 

我想刪除其中任何列包含-999,讓自己的數據幀將看起來像這樣排:

  A  B   C 
2 0.48845 5.7892 0.3145 
3 0.27828 0.4687 0.0641 

我肯定有是使用subset()函數或apply()完成此操作的簡單方法,但我無法弄清楚。

我嘗試這樣做:

test[apply(test, MARGIN = 1, FUN = function(x) {-999 != x}), ] 

但它返回:

   A  B   C 
1  0.31562 0.5674 -999.0000 
2  0.48845 5.7892 0.3145 
4 -999.00000 0.1345 -999.0000 
NA   NA  NA  NA 
NA.1   NA  NA  NA 
NA.2   NA  NA  NA 
NA.3   NA  NA  NA 
NA.4   NA  NA  NA 
NA.5   NA  NA  NA 
+2

'測試[!適用(試驗,1,函數(r)的任何(R = = -999)),]' – bouncyball

+1

你可以在處理這個更早的階段:當在集合中讀入時'na.strings =「 - 999」'。然後可以使用通常用於刪除丟失數據的行的工具。 – user20650

+0

使用'rowSums',你可以做'test [rowSums(test == -999)== 0,]',但是在read參數中使用'na.strings'是更好的選擇。 – lmo

回答

2

使用arr.indwhich獲得行,其中-999存在(which(test == -999, arr.ind = TRUE)[,1]),並刪除這些行。

test[-unique(which(test == -999, arr.ind = TRUE)[,1]),] 
#  A  B  C 
#2 0.48845 5.7892 0.3145 
#3 0.27828 0.4687 0.0641 
0

我們可以使用Reduce

test[!Reduce(`|`, lapply(test, `==`, -999)),] 
#  A  B  C 
#2 0.48845 5.7892 0.3145 
#3 0.27828 0.4687 0.0641 
相關問題