R:删除具有少于特定阈值非零值的行

时间:2016-06-11 00:13:39

标签: r dataframe subset

我想知道如何从数据框中删除少于(比如5个)非零条目的行。

我最接近的是:

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

但是如何将它应用于整个数据框并删除那些假的?是否有类似于excel中的COUNTIF()函数的函数,我可以在这里应用?

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

您可以在rowSums[中使用布尔值:

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

此表达式隐藏了3个步骤:

  • expression df > 0生成一个值为TRUE的矩阵,其中element> 0
  • 函数rowSums返回每行的非零元素数(当求和时,将值TRUE视为1,将FALSE视为0)
  • 最后[仅选择非零元素数量> = 5
  • 的行

答案 1 :(得分: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允许此脚本在您的数据包含缺失值时起作用。