简体   繁体   English

如何按条件删除行

[英]How to remove rows by condition

I'm trying to delete rows for which the condition is not satisfying eg.Remove that Subject row which do not have all period's value following is the dataframe 我正在尝试删除条件不满足的行。例如,删除没有所有句点值的主题行是数据帧

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

A dplyr solution. 一个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

A base R solution. 基础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

A solution using purrr and dplyr . 使用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

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)

考虑ave用于内联聚合然后相应的subset

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM