如何删除R中两列中具有相同值但ID不同的行[重复]

Posted

技术标签:

【中文标题】如何删除R中两列中具有相同值但ID不同的行[重复]【英文标题】:How remove rows with same value in their relation but different ID in two columns in R [duplicate] 【发布时间】:2022-01-21 17:58:15 【问题描述】:

我有一个巨大的数据集,当这种关系在意义上理解 ID1、ID2 或 ID2、ID1(在不同列中)时,变量中包含重复信息,变量中的值也可以从不同的 ID 关系中重复。我想使用反向 ID 顺序删除相同的信息,如下所示:

ID1         ID2         value
BHFUD13XG   KLSIENAL1   0.3475
GLADKK123   FBNAFLEL2   0.2956
KLSIENAL1   BHFUD13XG   0.3475
FBNAFLEL2   GLADKK123   0.2956
DGFEORM23   SHDKG14NV   0.3475
SHDKG14NV   DGFEORM23   0.3475

清洁

ID1         ID2         value
BHFUD13XG   KLSIENAL1   0.3475
GLADKK123   FBNAFLEL2   0.2956
DGFEORM23   SHDKG14NV   0.3475

感谢您的帮助!

【问题讨论】:

不要用图片发布您的数据。 我们无法从图像中复制/粘贴数据。请保留有用的编辑,使用纯文本格式的数据。 这在我看来可能有一个数据准备步骤,在此之前可能会以不同方式和更有效地完成。 ? 【参考方案1】:
library(dplyr)
library(purrr)

t <- tibble(
  ID1=c('BHFUD13XG','GLADKK123','KLSIENAL1','FBNAFLEL2','DGFEORM23','SHDKG14NV'),
  ID2=c('KLSIENAL1','FBNAFLEL2','BHFUD13XG','GLADKK123','SHDKG14NV','DGFEORM23'),
  value=c(.3475, .2956, .3475, .2956, .3475, .3475)
)

t

  ID1       ID2       value
  <chr>     <chr>     <dbl>
1 BHFUD13XG KLSIENAL1 0.3475
2 GLADKK123 FBNAFLEL2 0.2956
3 KLSIENAL1 BHFUD13XG 0.3475
4 FBNAFLEL2 GLADKK123 0.2956
5 DGFEORM23 SHDKG14NV 0.3475
6 SHDKG14NV DGFEORM23 0.3475

MakeKeys <- function(x) 
  # Replace `utf8ToInt` with appropriate encoding
  m <- map(x, function(s)sum(utf8ToInt(s)))
  flatten_int(m)


t <- t %>% mutate(k=MakeKeys(ID1)+MakeKeys(ID2)) %>% 
  distinct(k, .keep_all=TRUE) %>%
  select(-k)

t

  ID1       ID2       value
  <chr>     <chr>     <dbl>
1 BHFUD13XG KLSIENAL1 0.3475
2 GLADKK123 FBNAFLEL2 0.2956
3 DGFEORM23 SHDKG14NV 0.3475

【讨论】:

【参考方案2】:

如你所说,如果数据量很大,使用rowwise不是一个好主意,但你可以试试

library(dplyr)
df %>%
  rowwise %>%
  mutate(key = paste0(sort(c(ID1,ID2)), collapse = "-")) %>%
  select(value, key) %>%
  distinct() %>%
  separate(key, c("ID1", "ID2"), "-")

  value ID1       ID2      
  <dbl> <chr>     <chr>    
1 0.348 BHFUD13XG KLSIENAL1
2 0.296 FBNAFLEL2 GLADKK123
3 0.348 DGFEORM23 SHDKG14NV

df %>%
  mutate(id1 = pmin(ID1, ID2), id2 = pmax(ID1, ID2)) %>%
  select(id1, id2, value) %>%
  distinct()

        id1       id2  value
1 BHFUD13XG KLSIENAL1 0.3475
2 FBNAFLEL2 GLADKK123 0.2956
3 DGFEORM23 SHDKG14NV 0.3475

添加

df %>%
  mutate(id1 = pmin(ID1, ID2), id2 = pmax(ID1, ID2)) %>%
  distinct(id1, id2, value, .keep_all = T) %>%
  select(-id1, -id2) # and select whatever you want.

        ID1       ID2  value       id1       id2
1 BHFUD13XG KLSIENAL1 0.3475 BHFUD13XG KLSIENAL1
2 GLADKK123 FBNAFLEL2 0.2956 FBNAFLEL2 GLADKK123
3 DGFEORM23 SHDKG14NV 0.3475 DGFEORM23 SHDKG14NV

【讨论】:

谢谢,效果很好! :) 如果我想在我的数据中保留其他列信息,但删除与您建议的具有相同逻辑(值、ID1 和 ID2)的行,是否可以? @portillanath 添加.keep_all = T 参数,然后在select(...) 部分中选择您想要的任何内容。在列名前添加- 表示删除该列。

以上是关于如何删除R中两列中具有相同值但ID不同的行[重复]的主要内容,如果未能解决你的问题,请参考以下文章

EXCEL如何将两列中相同的行筛选出来并排序

R - 根据两列识别和删除重复行

如何检索表的值以获取sql中两列的最大值

VBA比较两个列表并删除不同列中具有重复值的行

SQL - 选择两列中具有相同值的行

如何选择在两列中具有相同值集的行,从而连接第三列中的值?