which () удаляет все строки, если возвращает integer (0) - PullRequest
0 голосов
/ 25 сентября 2018

Как и в заголовке, если у меня есть матрица 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 голосов
/ 25 сентября 2018

Решение, похоже, не отрицает 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
0 голосов
/ 25 сентября 2018

Если вы хотите удалить индексы, используя вектор, который может быть пустым, вы можете использовать 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
...