我想知道如何从数据框中删除少于(比如5个)非零条目的行。
我最接近的是:
length(which(df[1,] > 0)) >= 5
但是如何将它应用于整个数据框并删除那些假的?是否有类似于excel中的COUNTIF()函数的函数,我可以在这里应用?
感谢您的帮助。
答案 0 :(得分:3)
您可以在rowSums
和[
中使用布尔值:
df[ rowSums(df > 0) >= 5, ]
此表达式隐藏了3个步骤:
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
允许此脚本在您的数据包含缺失值时起作用。