Вы можете использовать dplyr
для этого. Сначала group_by
ваша группирующая переменная (и), а затем используйте filter_at
, чтобы отфильтровать по переменным, для которых вы заботитесь о полных случаях. Здесь мы используем starts_with
, чтобы выбрать все переменные VAR
(фактически, потому что нет других столбцов, которые мы могли бы использовать filter_all
). Затем мы используем all_vars
, чтобы обернуть предикат, который проверяет отсутствие пропущенных значений. Это в основном говорит: «Для каждой группы, проверьте, если all
значения в каждом столбце не пропущены. Сохраните строку, если это верно для всех столбцов (all_vars
)."
library(tidyverse)
tbl <- structure(list(GROUP_ID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), VAR_1 = c(2L, 3L, 4L, 3L, 9L, 2L, 2L, 2L, NA, 4L), VAR_2 = c(4L, 4L, NA, 2L, 8L, 3L, 5L, 1L, NA, 2L), VAR_3 = c(5L, 2L, 6L, 1L, 2L, 3L, 8L, 5L, 5L, 6L), VAR_4 = c(6L, 3L, 6L, 2L, 7L, 2L, 9L, 6L, 8L, 8L), VAR_5 = c(6L, 4L, 3L, 4L, 1L, 6L, 2L, NA, 9L, 7L)), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"), spec = structure(list(cols = list(GROUP_ID = structure(list(), class = c("collector_integer", "collector")), VAR_1 = structure(list(), class = c("collector_integer", "collector")), VAR_2 = structure(list(), class = c("collector_integer", "collector")), VAR_3 = structure(list(), class = c("collector_integer", "collector")), VAR_4 = structure(list(), class = c("collector_integer", "collector")), VAR_5 = structure(list(), class = c("collector_integer", "collector"))), default = structure(list(), class = c("collector_guess", "collector"))), class = "col_spec"))
tbl %>%
group_by(GROUP_ID) %>%
filter_at(vars(starts_with("VAR")), all_vars(all(!is.na(.))))
#> # A tibble: 3 x 6
#> # Groups: GROUP_ID [1]
#> GROUP_ID VAR_1 VAR_2 VAR_3 VAR_4 VAR_5
#> <int> <int> <int> <int> <int> <int>
#> 1 2 9 8 2 7 1
#> 2 2 2 3 3 2 6
#> 3 2 2 5 8 9 2
Создано в 2018-11-14 пакетом Представ (v0.2.1)