如何按条件删除行

问题描述 投票:0回答:2

我正在尝试删除条件不满足的行。例如,删除没有所有句点值的主题行是数据帧

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
r dataframe condition subset
2个回答
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

芭蕾舞P solutine。

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)

0
投票

考虑使用ave进行内联聚合,然后subset

sub_df <- subset(df, ave(Period, Subject, FUN=max) != 3)
© www.soinside.com 2019 - 2024. All rights reserved.