R - 我想通过大矩阵的行并删除所有零

时间:2014-08-07 13:28:30

标签: r matrix row

我在很大的矩阵(184 x 4000,类型为double)中有很多行和列,我想删除所有0。矩阵中的值通常大于0,但有些行为0.0000。我尝试用零删除行:

x <- x[which(rowSums(x) > 0),]

但我剩下的只是184中的3行。而且我知道删除的181行不是全部0行。 有没有人知道为什么会发生这种情况以及如何解决它?我在具有相同结构(184行,4000列)的不同矩阵上使用了相同的代码并且它起作用。我错过了什么?

5 个答案:

答案 0 :(得分:3)

您可以删除仅包含0的行(如果您想删除仅包含该数字的行,则可以将0替换为任何其他数字):

x <- x[rowSums(x == 0) != ncol(x),]

说明:

  • x == 0创建一个逻辑值矩阵(TRUE / FALSE)和 rowSums(x == 0)总结它们(TRUE == 1,FALSE == 0)。
  • 然后检查每行的总和是否等于列数 您的矩阵(由ncol(x)计算)。
  • 如果是这种情况(这意味着并非所有条目都是0),该行将被保留,因为它 评估为TRUE。所有其他行的计算结果为FALSE并将被删除。

答案 1 :(得分:2)

尝试使用此选项删除仅包含零的行。

x[!apply(x == 0, 1, all), , drop = FALSE]

答案 2 :(得分:1)

你可以尝试:

x[!rowSums(!x)==ncol(x),] #could be shortened to

x[!!rowSums(abs(x)),] #Inspired from @Richard Scriven

数据

 x <- structure(list(V1 = c(2, 0, 2, 2, 2, 3, 2, 0, 0, 3), V2 = c(2, 
   0, 0, 2, 3, 1, 0, 0, 0, 0), V3 = c(3, 0, 1, 3, 3, 2, 0, 3, 0, 
  1), V4 = c(3, 0, 2, 3, 2, 2, 2, 1, 2, 1), V5 = c(0, 0, 0, 0, 
  1, 2, 2, 2, 1, 3)), .Names = c("V1", "V2", "V3", "V4", "V5"), row.names = c(NA, 
  -10L), class = "data.frame")
  • !x。创建一个TRUE和FALSE的逻辑索引,其中TRUE将是0的
  • 元素
  • rowSums(!x)。 rowwise这些TRUE的总和,
  • ==ncol(x)。检查总和是否等于列数。在上面的例子中它是5.这意味着所有条目都是0
  • !再次否定,因为我们想要过滤掉这些行
  • 使用此逻辑索引的子集x

更新

假设您的数据集中包含NA,并且您希望删除所有0或具有0和NA的行,例如

 x <-   structure(list(V1 = c(2, 0, 2, 2, 2, 3, 2, 0, 0, 3), V2 = c(2, 
 NA, 0, 2, 3, 1, 0, 0, 0, 0), V3 = c(3, 0, 1, 3, 3, 2, 0, 3, 0, 
 1), V4 = c(3, 0, 2, 3, 2, 2, NA, 1, 2, 1), V5 = c(0, 0, 0, 0, 
 1, 2, 2, 2, 1, 3)), .Names = c("V1", "V2", "V3", "V4", "V5"), row.names = c(NA, 
 -10L), class = "data.frame")

 x[!(rowSums(!is.na(x) & !x)+rowSums(is.na(x)))==ncol(x),]
  • 我们的想法是先按行划分NAs
  • 所有非NA的元素的行和,为0 rowSUms(!is.na(x) & !x)

  • 取以上两者的总和。如果该数字与列数匹配,请删除该行

答案 3 :(得分:1)

我终于得到了答案。

之所以如此
x<- x[which(rowSums(x) > 0),]

仅返回184行中的3行是因为此函数仅为您提供那些不总和为0和/或其中没有NA的行。除了3排外,我还有几个NA,我只是没有意识到。 简单地取出NA并不起作用,因为那并没有解决rowSums问题。 我需要将我的NA作为零处理的功能,以便确实包含NA的行(除了3之外的所有行)也将被求和,而不仅仅是从矩阵中取出。所以我使用

将所有NA变为零
x[is.na(x)] <- 0

然后应用函数来总结所有行并删除加起来为0的那些行。它有效! 感谢大家的投入。特别是@arkun!

答案 4 :(得分:1)

这对我有用,@ Richard Scriven略有变化:

remove_zeros<- function(x)
{
  x = x[!apply(x == 0, 1, all),]
  return(x)
}