与标题中一样,如果我有一个矩阵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),该如何解决此问题?
答案 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