如果返回整数(0),则which()删除所有行

时间:2018-09-25 09:59:26

标签: r rows which

与标题中一样,如果我有一个矩阵a,并且我使用b条件创建了which()

a <- data.frame(var1 = rep(1, 10),
            var2 = runif(10,1,2))

b <- a[-which(a$var1 == 2),]

> a
   var1     var2
1     1 1.758612
2     1 1.772328
3     1 1.224777
4     1 1.525981
5     1 1.300347
6     1 1.464542
7     1 1.060128
8     1 1.192889
9     1 1.923877
10    1 1.958677

> dim(b)
[1] 0 2

which(a$var1 == 2)函数返回integer(0)并删除a的所有行。在自动化的情况下,无法知道先验是否不包含谷(如示例中的整数2),该如何解决此问题?

2 个答案:

答案 0 :(得分:1)

如果要使用可能为空的向量删除索引,则使用setdiff更安全:

b <- a[setdiff(seq_along(a$var1),which(a$var1 == 2)),]
b
   var1     var2
1     1 1.607701
2     1 1.898427
3     1 1.419441
4     1 1.685916
5     1 1.052964
6     1 1.924016
7     1 1.002527
8     1 1.873767
9     1 1.856852
10    1 1.092878

答案 1 :(得分:0)

该解决方案似乎避免了否定which,但是您可以否定%in%

set.seed(42)
a <- data.frame(var1 = 1:10,
        var2 = runif(10,1,2))

`%not_in%`<- Negate(`%in%`)
a[which(a$var1 %not_in% c(11,12)),]
#   var1     var2
#1     1 1.797066
#2     2 1.413511
#3     3 1.922845
#4     4 1.212539
#5     5 1.408266
#6     6 1.428282
#7     7 1.916336
#8     8 1.747179
#9     9 1.701980
#10   10 1.727161