根据列条件删除行
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
类型的行
假设我们有一个数据框:
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
类型的行