如何在不使用R中的rowSums的情况下删除全零的行?

时间:2018-03-21 07:49:20

标签: r dataframe

我的数据框中有0,1,N和负数,但我想删除全零的行。显然,我不能使用rowSums,因为我在数据框中有负数和正数。

SELECT

我想得到

> dd <- data.frame(a=c(0,0,0,0),b=c(0,-1,NA,1),c=c(0,1,0,-1),d=c(0,NA,0,0), e=c(0,0,NA,1))
> rownames(dd)<-paste("row",seq(1,nrow(dd),by=1),sep="")
> dd
     a  b  c  d  e
row1 0  0  0  0  0
row2 0 -1  1 NA  0
row3 0 NA  0  0 NA
row4 0  1 -1  0  1

3 个答案:

答案 0 :(得分:5)

您仍然可以使用rowSums,检查等于0的值的数量:

dd[rowSums(dd==0, na.rm=TRUE)<ncol(dd), ]
#  a  b  c  d  e
#2 0 -1  1 NA  0
#3 0 NA  0  0 NA
#4 0  1 -1  0  1

答案 1 :(得分:2)

另一种选择是使用applyfunction(x) any(x != 0 | is.na(x))来返回任何值不为0的行。

dd[apply(dd, 1, function(x) any(x != 0 | is.na(x))), ]
#      a  b  c  d  e
# row2 0 -1  1 NA  0
# row3 0 NA  0  0 NA
# row4 0  1 -1  0  1

答案 2 :(得分:0)

您可以使用all_are_zero <- function(row) all(row == 0) not_all_are_zero <- function(row) ! all_are_zero(row) dd[apply(dd, 1, not_all_are_zero),] 找出哪些行都是零,然后将否定子集。在下面的代码中,我为这些步骤制作了显式函数,但是如果你想避免这种情况,可以使用lambda表达式。

P = (500,700)
Range = 1000 #1000 meters for example
#Anonymize co-ordinates to within specified range
ANON_X = hash(P[0]) % Range
ANON_Y = hash(P[1]) % Range
#Randomly add/subtract range
P = (P + ANON_X*random.choice([-1,1]), P+ANON_Y*random.choice([-1,1]))