如果 3 列包含相同数据,则过滤数据框
Filter a data frame if 3 columns contain the same data
我有一些数据如下所示:
Municipios_Names Distritos_Names Zonas_Names
1 Barcelona Capital Sant Andreu Sant Andreu
2 Barcelona Capital Sant Andreu Baró de Viver
3 Barcelona Capital Sant Andreu El Bon Pastor
4 Barcelona Capital Sant Andreu El Congrés i els Indians
5 Barcelona Capital Sant Andreu La Sagrera
6 Barcelona Capital Sant Andreu Navas
7 Barcelona Capital Sant Andreu Sant Andreu del Palomar
8 Barcelona Capital Sant Andreu Trinitat Vella
9 Sant Adrià de Besòs Sant Adrià de Besòs Sant Adrià de Besòs
我正在尝试过滤数据,以便删除 Sant Andreu
。
我想根据以下条件筛选数据:
- 如果所有 3 列都相等,则保留该行。
- 如果所有 3 列都不同,则保留该行。
- 如果第一列与第二列和第三列不同,则提取该行(或者如果两列的任意组合不同)。
本质上,我只想删除 Barcelona Capital Sant Andreu Sant Andreu
但保留 Sant Adrià de Besòs Sant Adrià de Besòs Sant Adrià de Besòs
数据:
df <- structure(list(Municipios_Names = c("Barcelona Capital", "Barcelona Capital",
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital",
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital",
"Sant Adrià de Besòs"), Distritos_Names = c("Sant Andreu",
"Sant Andreu", "Sant Andreu", "Sant Andreu", "Sant Andreu", "Sant Andreu",
"Sant Andreu", "Sant Andreu", "Sant Adrià de Besòs"), Zonas_Names = c("Sant Andreu",
"Baró de Viver", "El Bon Pastor", "El Congrés i els Indians",
"La Sagrera", "Navas", "Sant Andreu del Palomar", "Trinitat Vella",
"Sant Adrià de Besòs")), class = "data.frame", row.names = c(NA,
-9L))
编辑:
我的主要目标是删除第一个观察结果 Barcelona Capital
、Sant Andreu
、Sant Andreu
。
- 如果我在满足以下条件时创建删除行的内容 -
Distritos_Names == Zonas_Names
那么我会正确删除第一行 - 但我也会错误地删除第 9 行 Sant Adrià de Besòs
。
- 所以我想写一些东西来保留第 9 行,因为所有 3 列都相同,但删除第 1 行,因为只有 2 列相同。
- 其他行
c(2:8)
都有不同的列,所以我想保留它们。
预期输出只是没有第一行的数据框。
我们可以对辅助列 x
和 y
使用 ifelse 语句,然后对它们进行过滤:
library(dplyr)
df %>%
mutate(x = ifelse(Municipios_Names==Distritos_Names &
Distritos_Names==Zonas_Names, 1, 0),
y = ifelse(Municipios_Names!=Distritos_Names &
Distritos_Names!=Zonas_Names, 1, 0)) %>%
filter(x==1 | y==1) %>%
select(-x, -y)
Municipios_Names Distritos_Names Zonas_Names
<chr> <chr> <chr>
1 Barcelona Capital Sant Andreu Baró de Viver
2 Barcelona Capital Sant Andreu El Bon Pastor
3 Barcelona Capital Sant Andreu El Congrés i els Indians
4 Barcelona Capital Sant Andreu La Sagrera
5 Barcelona Capital Sant Andreu Navas
6 Barcelona Capital Sant Andreu Sant Andreu del Palomar
7 Barcelona Capital Sant Andreu Trinitat Vella
8 Sant Adrià de Besòs Sant Adrià de Besòs Sant Adrià de Besòs
一个选项也在使用 n_distinct
library(dplyr)
df %>%
rowwise %>%
filter(n_distinct(c_across(everything())) %in% c(ncol(.), 1)) %>%
ungroup
-输出
# A tibble: 8 × 3
Municipios_Names Distritos_Names Zonas_Names
<chr> <chr> <chr>
1 Barcelona Capital Sant Andreu Baró de Viver
2 Barcelona Capital Sant Andreu El Bon Pastor
3 Barcelona Capital Sant Andreu El Congrés i els Indians
4 Barcelona Capital Sant Andreu La Sagrera
5 Barcelona Capital Sant Andreu Navas
6 Barcelona Capital Sant Andreu Sant Andreu del Palomar
7 Barcelona Capital Sant Andreu Trinitat Vella
8 Sant Adrià de Besòs Sant Adrià de Besòs Sant Adrià de Besòs
或 pmap
library(purrr)
df %>%
filter(pmap_lgl(across(everything()),
~ n_distinct(c(...)) %in% c(ncol(df), 1)))
我有一些数据如下所示:
Municipios_Names Distritos_Names Zonas_Names
1 Barcelona Capital Sant Andreu Sant Andreu
2 Barcelona Capital Sant Andreu Baró de Viver
3 Barcelona Capital Sant Andreu El Bon Pastor
4 Barcelona Capital Sant Andreu El Congrés i els Indians
5 Barcelona Capital Sant Andreu La Sagrera
6 Barcelona Capital Sant Andreu Navas
7 Barcelona Capital Sant Andreu Sant Andreu del Palomar
8 Barcelona Capital Sant Andreu Trinitat Vella
9 Sant Adrià de Besòs Sant Adrià de Besòs Sant Adrià de Besòs
我正在尝试过滤数据,以便删除 Sant Andreu
。
我想根据以下条件筛选数据:
- 如果所有 3 列都相等,则保留该行。
- 如果所有 3 列都不同,则保留该行。
- 如果第一列与第二列和第三列不同,则提取该行(或者如果两列的任意组合不同)。
本质上,我只想删除 Barcelona Capital Sant Andreu Sant Andreu
但保留 Sant Adrià de Besòs Sant Adrià de Besòs Sant Adrià de Besòs
数据:
df <- structure(list(Municipios_Names = c("Barcelona Capital", "Barcelona Capital",
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital",
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital",
"Sant Adrià de Besòs"), Distritos_Names = c("Sant Andreu",
"Sant Andreu", "Sant Andreu", "Sant Andreu", "Sant Andreu", "Sant Andreu",
"Sant Andreu", "Sant Andreu", "Sant Adrià de Besòs"), Zonas_Names = c("Sant Andreu",
"Baró de Viver", "El Bon Pastor", "El Congrés i els Indians",
"La Sagrera", "Navas", "Sant Andreu del Palomar", "Trinitat Vella",
"Sant Adrià de Besòs")), class = "data.frame", row.names = c(NA,
-9L))
编辑:
我的主要目标是删除第一个观察结果 Barcelona Capital
、Sant Andreu
、Sant Andreu
。
- 如果我在满足以下条件时创建删除行的内容 -
Distritos_Names == Zonas_Names
那么我会正确删除第一行 - 但我也会错误地删除第 9 行Sant Adrià de Besòs
。 - 所以我想写一些东西来保留第 9 行,因为所有 3 列都相同,但删除第 1 行,因为只有 2 列相同。
- 其他行
c(2:8)
都有不同的列,所以我想保留它们。
预期输出只是没有第一行的数据框。
我们可以对辅助列 x
和 y
使用 ifelse 语句,然后对它们进行过滤:
library(dplyr)
df %>%
mutate(x = ifelse(Municipios_Names==Distritos_Names &
Distritos_Names==Zonas_Names, 1, 0),
y = ifelse(Municipios_Names!=Distritos_Names &
Distritos_Names!=Zonas_Names, 1, 0)) %>%
filter(x==1 | y==1) %>%
select(-x, -y)
Municipios_Names Distritos_Names Zonas_Names
<chr> <chr> <chr>
1 Barcelona Capital Sant Andreu Baró de Viver
2 Barcelona Capital Sant Andreu El Bon Pastor
3 Barcelona Capital Sant Andreu El Congrés i els Indians
4 Barcelona Capital Sant Andreu La Sagrera
5 Barcelona Capital Sant Andreu Navas
6 Barcelona Capital Sant Andreu Sant Andreu del Palomar
7 Barcelona Capital Sant Andreu Trinitat Vella
8 Sant Adrià de Besòs Sant Adrià de Besòs Sant Adrià de Besòs
一个选项也在使用 n_distinct
library(dplyr)
df %>%
rowwise %>%
filter(n_distinct(c_across(everything())) %in% c(ncol(.), 1)) %>%
ungroup
-输出
# A tibble: 8 × 3
Municipios_Names Distritos_Names Zonas_Names
<chr> <chr> <chr>
1 Barcelona Capital Sant Andreu Baró de Viver
2 Barcelona Capital Sant Andreu El Bon Pastor
3 Barcelona Capital Sant Andreu El Congrés i els Indians
4 Barcelona Capital Sant Andreu La Sagrera
5 Barcelona Capital Sant Andreu Navas
6 Barcelona Capital Sant Andreu Sant Andreu del Palomar
7 Barcelona Capital Sant Andreu Trinitat Vella
8 Sant Adrià de Besòs Sant Adrià de Besòs Sant Adrià de Besòs
或 pmap
library(purrr)
df %>%
filter(pmap_lgl(across(everything()),
~ n_distinct(c(...)) %in% c(ncol(df), 1)))