2016-06-11 190 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允许此脚本在您的数据包含缺失值时工作。