Мы можем создать условие с помощью rowSums
df1[!(rowSums(is.na(df1[-3])) > 0 & !is.na(df1[[3]])),]
# col1 col2 col3
#2 21 11 NA
#3 NA 2 NA
#4 3 NA NA
#6 8 12 5
#7 41 39 9
Когда мы делаем rowSums(is.na(df1[-3])) > 0
, он проверяет любой NA в первых двух столбцах и возвращает TRUE для этих случаев
rowSums(is.na(df1[-3])) > 0
#[1] TRUE FALSE TRUE TRUE TRUE FALSE FALSE
Но мы хотим удалить эту первую строку, потому что в 'col3'
для этой строки нет NA
Далее мы проверяем NA
s в 'col3'
is.na(df1[[3]])
#[1] FALSE TRUE TRUE TRUE FALSE FALSE FALSE
Везде, где есть ИСТИНА, мы хотим сохранить его. Итак, если мы сделаем &
, он вернет NA
, общий для обоих
(rowSums(is.na(df1[-3])) > 0 & !is.na(df1[[3]]))
#[1] TRUE FALSE FALSE FALSE TRUE FALSE FALSE
, то есть 1-я и 5-я строки имеют NA в обоих блоках столбцов. Отрицание этого меняет TRUE-> FALSE
и FALSE-> TRUE
!(rowSums(is.na(df1[-3])) > 0 & !is.na(df1[[3]]))
#[1] FALSE TRUE TRUE TRUE FALSE TRUE TRUE
, то есть строки, которые могут иметь оба набора, не имеющие NA, или 'col3' с NA, а другие строки могут иметь или не иметь NA
или используйте те же логи c в filter
library(dplyr)
df1 %>%
filter(!(rowSums(is.na(.[-3])) > 0 & !is.na(col3)))
data
df1 <- structure(list(col1 = c(12L, 21L, NA, 3L, NA, 8L, 41L), col2 = c(NA,
11L, 2L, NA, NA, 12L, 39L), col3 = c(2L, NA, NA, NA, 4L, 5L,
9L)), class = "data.frame", row.names = c(NA, -7L))