我的数据框中有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
答案 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)
另一种选择是使用apply
和function(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]))