根据两列中的组合删除“重复”行 (R)

问题描述 投票:0回答:1

我有这个示例 data.frame:

 df1 <- data.frame(v1 = c('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'),
      v2 = c('B', 'A', 'D', 'C', 'F', 'E', 'H', 'G'),
      value = c(1.12, 1.12, 12.52, 12.52, 3.19, 3.19, 12.52, 12.52))
 > df1
   v1 v2 value
 1  A  B  1.12
 2  B  A  1.12
 3  C  D 12.52
 4  D  C 12.52
 5  E  F  3.19
 6  F  E  3.19
 7  G  H 12.52
 8  H  G 12.52

row 1
中的A和B等组合对我来说与B和A等组合相同,其中
value
列中的值也相同。如何删除出于我的目的而重复的行?

预期结果:

 df2 <- data.frame(v1 = c('A', 'C', 'E', 'G'),
      v2 = c('B', 'D', 'F', 'H'),
      value = c(1.12, 12.52, 3.19, 12.52))

 > df2
   v1 v2 value
 1  A  B  1.12
 2  C  D 12.52
 3  E  F  3.19
 4  G  H 12.52
r duplicates row multiple-columns drop-duplicates
1个回答
0
投票

这个想法是考虑 v1 和 v2 可以互换。

df1 <- data.frame(v1 = c('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'),
                  v2 = c('B', 'A', 'D', 'C', 'F', 'E', 'H', 'G'),
                  value = c(1.12, 1.12, 12.52, 12.52, 3.19, 3.19, 12.52, 12.52))


library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(purrr)

### with tidyverse:
df2 <- df1 %>%
        mutate(combination = pmap_chr(list(v1, v2), ~ paste(sort(c(..1, ..2)), collapse = ","))) %>%
        filter(!duplicated(combination)) %>%
        select(-combination)

df2
#>   v1 v2 value
#> 1  A  B  1.12
#> 2  C  D 12.52
#> 3  E  F  3.19
#> 4  G  H 12.52

### Base R:
df2 <- df1[!duplicated(t(apply(df1[, c("v1", "v2")], 1, sort))), ]

df2
#>   v1 v2 value
#> 1  A  B  1.12
#> 3  C  D 12.52
#> 5  E  F  3.19
#> 7  G  H 12.52

创建于 2023-12-24,使用 reprex v2.0.2

© www.soinside.com 2019 - 2024. All rights reserved.