如何通过查看数据框中的其他列值来删除重复值?
How can I remove duplicate values by looking at other column values in the data frame?
有两列item1和item2列的值相反,列的顺序是随机的。
我想查找并删除 item1 和 item2 列中具有相同值的数据。
像这样...
我该怎么办?
我正在考虑一个更普遍的案例
dput(df)
df <- structure(list(Item1 = c("A", "C", "B", "D", "E", "F"), Item2 = c("B",
"D", "A", "C", "F", "E"), Result = c(0.5, 0.1, 0.5, 0.1, 0.7,
0.6)), class = "data.frame", row.names = c(NA, -6L))
> df
Item1 Item2 Result
1 A B 0.5
2 C D 0.1
3 B A 0.5
4 D C 0.1
5 E F 0.7
6 F E 0.6
代码
library(tidyverse)
df %>% pivot_longer(cols = c("Item1", "Item2")) %>%
group_by(Result, value) %>%
slice_head() %>%
group_by(Result) %>%
pivot_wider(id_cols = Result, names_from = name, values_from = value)
# A tibble: 4 x 3
# Groups: Result [4]
Result Item1 Item2
<dbl> <chr> <chr>
1 0.1 C D
2 0.5 A B
3 0.6 F E
4 0.7 E F
您可以使用 pmin
和 pmax
按字母顺序对值进行排序,select 对唯一行进行排序。
library(dplyr)
df %>%
transmute(Item_1 = pmin(Item1, Item2),
Item_2 = pmax(Item1, Item2),
Result) %>%
distinct()
# Item_1 Item_2 Result
#1 A B 0.5
#2 C D 0.1
在基数 R 中:
unique(transform(df, Item1 = pmin(Item1, Item2),
Item2 = pmax(Item1, Item2)))
使用base
df <- structure(list(Item1 = c("A", "C", "B", "D", "E", "F"),
Item2 = c("B", "D", "A", "C", "F", "E"),
Result = c(0.5, 0.1, 0.5, 0.1, 0.7, 0.6)),
class = "data.frame", row.names = c(NA, -6L))
fltr <- !duplicated(apply(df, 1, function(x) paste(sort(x), collapse = "")))
df[fltr, ]
#> Item1 Item2 Result
#> 1 A B 0.5
#> 2 C D 0.1
#> 5 E F 0.7
#> 6 F E 0.6
由 reprex package (v0.3.0)
于 2021 年 1 月 15 日创建
有两列item1和item2列的值相反,列的顺序是随机的。
我想查找并删除 item1 和 item2 列中具有相同值的数据。
像这样...
我该怎么办?
我正在考虑一个更普遍的案例
dput(df)
df <- structure(list(Item1 = c("A", "C", "B", "D", "E", "F"), Item2 = c("B",
"D", "A", "C", "F", "E"), Result = c(0.5, 0.1, 0.5, 0.1, 0.7,
0.6)), class = "data.frame", row.names = c(NA, -6L))
> df
Item1 Item2 Result
1 A B 0.5
2 C D 0.1
3 B A 0.5
4 D C 0.1
5 E F 0.7
6 F E 0.6
代码
library(tidyverse)
df %>% pivot_longer(cols = c("Item1", "Item2")) %>%
group_by(Result, value) %>%
slice_head() %>%
group_by(Result) %>%
pivot_wider(id_cols = Result, names_from = name, values_from = value)
# A tibble: 4 x 3
# Groups: Result [4]
Result Item1 Item2
<dbl> <chr> <chr>
1 0.1 C D
2 0.5 A B
3 0.6 F E
4 0.7 E F
您可以使用 pmin
和 pmax
按字母顺序对值进行排序,select 对唯一行进行排序。
library(dplyr)
df %>%
transmute(Item_1 = pmin(Item1, Item2),
Item_2 = pmax(Item1, Item2),
Result) %>%
distinct()
# Item_1 Item_2 Result
#1 A B 0.5
#2 C D 0.1
在基数 R 中:
unique(transform(df, Item1 = pmin(Item1, Item2),
Item2 = pmax(Item1, Item2)))
使用base
df <- structure(list(Item1 = c("A", "C", "B", "D", "E", "F"),
Item2 = c("B", "D", "A", "C", "F", "E"),
Result = c(0.5, 0.1, 0.5, 0.1, 0.7, 0.6)),
class = "data.frame", row.names = c(NA, -6L))
fltr <- !duplicated(apply(df, 1, function(x) paste(sort(x), collapse = "")))
df[fltr, ]
#> Item1 Item2 Result
#> 1 A B 0.5
#> 2 C D 0.1
#> 5 E F 0.7
#> 6 F E 0.6
由 reprex package (v0.3.0)
于 2021 年 1 月 15 日创建