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

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

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

Ответы [ 3 ]

0 голосов
/ 03 октября 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
0 голосов
/ 03 октября 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
0 голосов
/ 02 октября 2018

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

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

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

all(!is.na(value))
sum(is.na(value)) == 0
!any(is.na(value))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...