根据列条件删除行

Removing rows based on column conditions

假设我们有一个数据框:

Event <- c("A", "A", "A", "B", "B", "C" , "C", "C")
Model <- c( 1, 2, 3, 1, 2, 1, 2, 3)

df <- data.frame(Event, Model)

看起来像这样:

event Model
A 1
A 2
A 3
B 1
B 2
C 1
C 2
C 3

我们可以看到事件B只有2个模型的数据。由于我使用的实际数据框有数千行和 17 列,我如何删除所有没有 3 个模型的事件?我的猜测是使用一个子集,但是我不确定当我们有多个条件时该怎么做。

我尝试了下面 YH Jang 建议的代码:

df %>% group_by(Event) %>% 
  filter(max(Model)==3) 

但是,这会遗漏数据中看起来像这样的条目。

event Model
A 1
A 3

示例:

# A tibble: 6 × 2
# Groups:   Event [2]
  Event Model
  <chr> <dbl>
1 A         1
2 A         3
4 C         1
5 C         2
6 C         3

使用dplyr,

df %>% group_by(Event) %>% 
  filter(max(Model)=3) 

结果会是

# A tibble: 6 × 2
# Groups:   Event [2]
  Event Model
  <chr> <dbl>
1 A         1
2 A         2
3 A         3
4 C         1
5 C         2
6 C         3

或使用data.table

df[df[,.I[max(Model)==3],by=Event]$V1]

结果同下

   Event Model
1:     A     1
2:     A     2
3:     A     3
4:     C     1
5:     C     2
6:     C     3

编辑
我误解了这个问题。 这是编辑后的答案。

# with dplyr
df %>% group_by(Event) %>% 
  filter(length(Model)>=3) 

# with data.table
df[df[,.I[length(Model)>=3],by=Event]$V1]

试试这个:

library(dplyr)
df %>% group_by(Event) %>% 
  filter(length(Model) >= 3)

或者,更简洁地说:

 df %>% group_by(Event) %>% 
  filter(n() >= 3)

这会删除少于三种 Model 类型的行