我在很大的矩阵(184 x 4000,类型为double)中有很多行和列,我想删除所有0。矩阵中的值通常大于0,但有些行为0.0000。我尝试用零删除行:
x <- x[which(rowSums(x) > 0),]
但我剩下的只是184中的3行。而且我知道删除的181行不是全部0行。 有没有人知道为什么会发生这种情况以及如何解决它?我在具有相同结构(184行,4000列)的不同矩阵上使用了相同的代码并且它起作用。我错过了什么?
答案 0 :(得分:3)
您可以删除仅包含0的行(如果您想删除仅包含该数字的行,则可以将0替换为任何其他数字):
x <- x[rowSums(x == 0) != ncol(x),]
说明:
x == 0
创建一个逻辑值矩阵(TRUE / FALSE)和
rowSums(x == 0)
总结它们(TRUE == 1,FALSE == 0)。 ncol(x)
计算)。 答案 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),]
所有非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)
}