Удалить строки в data.frame, появляющиеся в другом data.frame, по rowname () как id - PullRequest
0 голосов
/ 03 сентября 2018

Я знаю, что есть несколько похожих вопросов. Но ответ для них не помогает в моем случае, или я действительно понял их неправильно.

Мой пример кода

set.seed(0)

df <- data.frame(A = seq(20),
                 B1 = sample(c(T, F), 20, replace=T),
                 B2 = sample(c(T, F), 20, replace=T))

rownames(df) <- df$A
df <- df[, c('B1', 'B2'), drop = FALSE]

result <- df[df$B1 == FALSE & df$B2 == FALSE, ]

print(result)

Результаты в этом

> result
      B1    B2
1  FALSE FALSE
4  FALSE FALSE
10 FALSE FALSE
16 FALSE FALSE
18 FALSE FALSE

Итак, вы видите 5 случаев в конце. Я хочу, чтобы эти 5 случаев были удалены из исходного data.frame df без потери rownames() или именования строк. Поэтому строки с именами 1, 4, 10, 16, 18 должны быть удалены без переименования других строк.

Что я пытался (основываясь на других ответах):

> library(dplyr)
> anti_join(df, result)
Joining, by = c("B1", "B2")
      B1    B2
1   TRUE FALSE
2   TRUE  TRUE
3  FALSE  TRUE
4   TRUE  TRUE
5  FALSE  TRUE
6  FALSE  TRUE
7  FALSE  TRUE
8   TRUE  TRUE
9   TRUE  TRUE
10  TRUE FALSE
11 FALSE  TRUE
12  TRUE  TRUE
13  TRUE FALSE
14 FALSE  TRUE
15  TRUE FALSE

Имена строк здесь не верны. Их просто от 1 до 15.

Еще одна попытка не имеет смысла для меня

> setdiff(df, result)
     B1    B2
1  TRUE FALSE
2  TRUE  TRUE
3 FALSE  TRUE

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Мы можем использовать %in% с !

df[!rownames(df) %in% rownames(result),]
0 голосов
/ 03 сентября 2018

Опция с setdiff будет:

df[setdiff(rownames(df), rownames(result)), ]

#      B1    B2
#2   TRUE FALSE
#3   TRUE  TRUE
#5  FALSE  TRUE
#6   TRUE  TRUE
#7  FALSE  TRUE
#8  FALSE  TRUE
#9  FALSE  TRUE
#11  TRUE  TRUE
#12  TRUE  TRUE
#13  TRUE FALSE
#14 FALSE  TRUE
#15  TRUE  TRUE
#17  TRUE FALSE
#19 FALSE  TRUE
#20  TRUE FALSE

Однако более общий подход, который я бы предложил, заключался в том, чтобы рассчитывать индексы только один раз и использовать их.

inds <- df$B1 == FALSE & df$B2 == FALSE
result <- df[inds, ]
output <- df[!inds, ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...