如何删除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不同的行[重复]的主要内容,如果未能解决你的问题,请参考以下文章