Как исключить группу, если частота данных в данных выше определенного порога в dplyr? - PullRequest
0 голосов
/ 08 апреля 2020

Как мне получить от

# A tibble: 6 x 2
  group_var psbl_NAs
  <chr>        <dbl>
1 a                1
2 a               NA
3 a               NA
4 b                1
5 b                1
6 b               NA

до

# A tibble: 6 x 2
  group_var psbl_NAs
  <chr>        <dbl>
1 b                1
2 b                1
3 b               NA

, используя тот факт, что psbl_NAs в группе "a" присутствуют в более чем 50% данных ?

tibble(
  group_var = c(rep("a",3), rep("b",3)),
  psbl_NAs  = c(1, NA, NA, 1, 1, NA)
) %>% 
group_by(group_var) %>%
??????

1 Ответ

1 голос
/ 08 апреля 2020

Мы можем 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,]
...