Удалить группу, содержащую НП только в некоторых строках

Мне нужно удалить годы, для которых нет измерений на каждый день года. Представьте, что это полный набор, и я хочу избавиться от всех строк 2001 года, потому что в 2001 году отсутствует одно измерение.

year    day    value  
2000     1       5
2000     2       3  
2000     3       2
2000     4       3  
2001     1       2
2001     2       NA  
2001     3       6  
2001     4       5

Извините, у меня нет попыток кода, я не могу сейчас обдумать это, и мне потребовалась целая вечность, чтобы зайти так далеко. Предпочитаю то, что я могу%>%, так как это в конце длительного периода.


person Nazer    schedule 02.10.2018    source источник


Ответы (3)


Фильтрация по наличию NA значений:

df %>% 
 group_by(year) %>%
 filter(!anyNA(value))

Альтернативные filter условия (выберите наиболее читаемые):

all(!is.na(value))
sum(is.na(value)) == 0
!any(is.na(value))
person Gregor Thomas    schedule 02.10.2018
comment
anyNA оптимизирован, поэтому я бы порекомендовал ему другие альтернативы, похоже, вот где он родился: r.789695.n4.nabble.com/hasNA-anyNA-td916900.html - person Moody_Mudskipper; 03.10.2018

Вот однострочное решение с использованием базы R -

df %>% .[!ave(.$value, .$year, FUN = anyNA), ]

Пример -

df <- data.frame(year = c(rep(2000, 4), rep(2001, 4)), day = 1:4, value = sample.int(10, 8))
df$value[6] <- NA_integer_

#   year day value
# 1 2000   1     4
# 2 2000   2     3
# 3 2000   3     2
# 4 2000   4     7
# 5 2001   1     8
# 6 2001   2    NA
# 7 2001   3     1
# 8 2001   4     5

df %>% .[!ave(.$value, .$year, FUN = anyNA), ]

#   year day value
# 1 2000   1     4
# 2 2000   2     3
# 3 2000   3     2
# 4 2000   4     7
person Shree    schedule 02.10.2018
comment
Я предлагаю subset(df,!ave(value, year, FUN = anyNA)) остаться на базе R - person Moody_Mudskipper; 03.10.2018

В базе R вы могли:

subset(df,!year %in% year[is.na(value)])
#   year day value
# 1 2000   1     8
# 2 2000   2     5
# 3 2000   3     4
# 4 2000   4     1
person Moody_Mudskipper    schedule 03.10.2018