【发布时间】:2021-12-05 04:27:58
【问题描述】:
【问题讨论】:
标签: r dataframe duplicates row identity-column
【问题讨论】:
标签: r dataframe duplicates row identity-column
我正在举一个更笼统的案例
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 按字母顺序对值进行排序并选择唯一的行。
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)))
【讨论】:
A->B 被选中而不是 B->A)。看看这个例子,我猜一个项目是否被归类为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-01-15 创建
【讨论】: