Как удалить строки по условию - PullRequest
0 голосов
/ 06 апреля 2019

Я пытаюсь удалить строки, для которых условие не удовлетворяет, например. Удалите строку Subject, которая не имеет всех значений периода, следующих за кадром данных

Subject          Period
1                  1
1                  2
1                  3
2                  1
2                  2
2                  3
3                  1
3                  2
4                  1
4                  2
4                  3


Subject          Period
1                  1
1                  2
1                  3
2                  1
2                  2
2                  3
4                  1
4                  2
4                  3

Ответы [ 2 ]

0 голосов
/ 06 апреля 2019

Рассмотрим ave для встроенной агрегации, затем subset соответственно:

sub_df <- subset(df, ave(Period, Subject, FUN=max) != 3)
0 голосов
/ 06 апреля 2019

A dplyr раствор.

library(dplyr)
dat %>% 
  group_by(Subject) %>%
  filter(all(unique(dat$Period) %in% Period)) %>%
  ungroup()
# # A tibble: 9 x 2
#   Subject Period
#     <int>  <int>
# 1       1      1
# 2       1      2
# 3       1      3
# 4       2      1
# 5       2      2
# 6       2      3
# 7       4      1
# 8       4      2
# 9       4      3

Базовый раствор R.

dat_list <- split(dat, f = dat$Subject) 
keep_vec <- sapply(dat_list, function(x) all(unique(dat$Period) %in% x$Period))
dat_keep <- dat_list[keep_vec]

dat2 <- do.call(rbind, dat_keep)
dat2
#      Subject Period
# 1.1        1      1
# 1.2        1      2
# 1.3        1      3
# 2.4        2      1
# 2.5        2      2
# 2.6        2      3
# 4.9        4      1
# 4.10       4      2
# 4.11       4      3

Решение с использованием purrr и dplyr.

library(purrr)
library(dplyr)

dat2 <- dat %>%
  split(f = .$Subject) %>%
  keep(~all(unique(dat$Period) %in% .x$Period)) %>%
  bind_rows()
dat2
#   Subject Period
# 1       1      1
# 2       1      2
# 3       1      3
# 4       2      1
# 5       2      2
# 6       2      3
# 7       4      1
# 8       4      2
# 9       4      3

DATA

dat <- read.table(text = "Subject          Period
1                  1
                  1                  2
                  1                  3
                  2                  1
                  2                  2
                  2                  3
                  3                  1
                  3                  2
                  4                  1
                  4                  2
                  4                  3",
                  header = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...