Удалить строки на основе бинарных данных и условий NA - PullRequest
0 голосов
/ 11 мая 2018

Представьте, что у нас есть три столбца в наборе данных DF: A, B и C.

A является двоичным, тогда как B и C являются порядковыми.

Иногда B и C означают NA, иногда в одном ряду, а иногда нет.

Теперь я хочу удалить строки, где B или C - это NA при условии, что A = 0. Если A = 1, не имеет значения, является ли B или C NA.

Какой самый простой / простой способ сделать это?

Я попробовал это с if else, но поскольку B и C имеют значения NA, я получаю предупреждение, что это не TRUE / FALSE.

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Вот пример использования tidyverse, и dplyr::filter в частности. Легко построить правильный набор условий, мы хотим, чтобы строки были либо A == 1, либо где !is.na(B) и !is.na(C). Я также arrange на A, чтобы вы могли видеть, что нет строк NA, где A == 0.

library(tidyverse)
set.seed(100)
tbl <- data.frame(
  A = sample(0:1, 20, replace = TRUE),
  B = sample(c(1, 2, NA), 20, replace = TRUE),
  C = sample(c(3, 4, NA), 20, replace = TRUE)
)

tbl %>%
  filter((A == 1) | (!is.na(B) & !is.na(C))) %>%
  arrange(A)
#>    A  B  C
#> 1  0  2  3
#> 2  0  2  4
#> 3  0  1  4
#> 4  0  1  3
#> 5  0  2  3
#> 6  0  1  3
#> 7  0  2  3
#> 8  1  2 NA
#> 9  1 NA NA
#> 10 1  2  3
#> 11 1  2  3
#> 12 1 NA  3
#> 13 1 NA  4
#> 14 1 NA  3
#> 15 1  1  3

Создано в 2018-05-10 пакетом представ (v0.2.0).

0 голосов
/ 11 мая 2018

Простое базовое решение R будет

DF[DF$A == 1 | (DF$A != 1 & !is.na(DF$B)) | (DF$A != 1 & !is.na(DF$C)), ]

или

DF[ifelse(DF$A == 0, !is.na(DF$B) & !is.na(DF$C), TRUE), ]
...