2016-06-11 189 views
2

我想知道如何從數據框中刪除少於(假設爲5)非零條目的行。R:刪除行數小於某個閾值的非零值

我來最接近的是:

length(which(df[1,] > 0)) >= 5 

但如何將其應用到整個數據幀丟棄是假的人?是否有一個函數類似於excel中的COUNTIF()函數,我可以在這裏應用?

謝謝你的幫助。

+0

你的意思是'> ='而不是'=>'對嗎? – SabDeM

回答

3

可以在rowSums[使用布爾值:

df[ rowSums(df > 0) >= 5, ] 

有隱藏在這個表達式3個步驟:

  • 表達df > 0產生一個矩陣具有值TRUE其中元件> 0
  • 函數rowSums返回每行的非零元素的數目(當它將TRUE值設爲1並將FALSE值設爲0時)
  • 最後[僅選擇線,其中的非零元素的數量> = 5
+0

謝謝你的迴應,但我想你誤解了我的問題。我沒有查找條目的總和,而是查找非零條目的數量。例如,如果一行包含0 0 0 5 2 0我希望它被刪除。類似於在excel中應用COUNTIF()函數 – lizz0427

+0

請注意,rowSums不會應用於條目,而會應用於由表達式'df> 5'生成的布爾矩陣。結果是一個布爾向量,用於過濾掉少於5個非零元素的行。應該沒問題。 – bergant

+0

@ lizz0427查看答案更新以獲取解釋。 – bergant

0

也可以使用一個for循環。

我們首先創建一個零和一個矩陣來測試我們的代碼。第2行必須被排除,因爲它具有少於5個非零值。

在循環中,我們計算每行非零值的數量,如果小於5則爲TRUE,否則爲FALSE。名爲'drop'的向量包含哪些行爲TRUE,然後FALSE的信息。在最後一步中,我們排除那些drop == TRUE的行。

mat <- matrix(c(1,1,1,1,0,1,1,1,1,1,1,1,1,1,1), nrow=3, ncol=5) 
mat 

    [,1] [,2] [,3] [,4] [,5] 
[1,] 1 1 1 1 1 
[2,] 1 0 1 1 1 
[3,] 1 1 1 1 1 

drop <- NULL 
for(i in 1:NROW(mat)){ 
    count.non.zero <- sum(mat[i,]!=0, na.rm=TRUE) 
    drop <- c(drop, count.non.zero<5) 
} 

mat[!drop==TRUE,] 

    [,1] [,2] [,3] [,4] [,5] 
[1,] 1 1 1 1 1 
[2,] 1 1 1 1 1 

注意:na.rm==TRUE允許此腳本在您的數據包含缺失值時工作。