Мы можем group_by
, mutate
, а затем filter
:
d %>%
group_by(group_var) %>%
# calculate % of NA values by group
mutate(pct_na = mean(is.na(psbl_NAs))) %>%
# only keep where % of NA values < 0.5
filter(pct_na < 0.5) %>%
select(-pct_na) # remove % NA column
# group_var psbl_NAs
# <chr> <dbl>
# 1 b 1
# 2 b 1
# 3 b NA
Может быть поучительно посмотреть результат нашего вычисления% NA:
d %>%
group_by(group_var) %>%
# calculate % of NA values by group
mutate(pct_na = mean(is.na(psbl_NAs)))
# group_var psbl_NAs pct_na
# <chr> <dbl> <dbl>
# 1 a 1 0.667
# 2 a NA 0.667
# 3 a NA 0.667
# 4 b 1 0.333
# 5 b 1 0.333
# 6 b NA 0.333
Вот решение из одной строки R
, использующее ave
:
d[with(d, ave(psbl_NAs, group_var, FUN = function(x) mean(is.na(x)))) < 0.5,]