如何按条件删除行

时间:2019-04-06 14:30:36

标签: r dataframe conditional-statements subset

我正在尝试删除条件不满足的行 例如,删除没有所有期间值的“主题”行 以下是数据框

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 :(得分:0)

一种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

使用purrrdplyr的解决方案。

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

数据

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)

答案 1 :(得分:0)

考虑ave进行内联聚合,然后subset相应地:

sub_df <- subset(df, ave(Period, Subject, FUN=max) != 3)