数据库关系中任意两列可以相同吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库关系中任意两列可以相同吗相关的知识,希望对你有一定的参考价值。

参考技术A

不同列的数据类型可以相同,数据类型是按行分的

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

【中文标题】如何删除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如何将两列中相同的行筛选出来并排序

excel如何在一堆数据中查找出需要的数据

实参和形参的关系2.函数的参数可以是任意数据类型吗?3。函数的作用域问题

Excel如何把两列中相同的数据找出,并对应内容排列?

excel中同一个sheet下有两列相同的表头,如何合为一列