我有 2 个数据框。现在,我想获取这两个数据帧的常见行和不常见行。
在这里,公共行可以是vice versa
. 这意味着我正在搜索两个数据集之间的共同点,这些数据集可以按照匹配列的顺序发生变化。例如,row number 2
的df_1
是ID_2 ID_3
和df_2
是ID_3 ID_2
。它们在列值方面并不常见,但如果我们不考虑列值,它们是常见的。
获得 common 和 uncommon 后,我想添加另一列label
作为1 for common
and 0 for uncommon
。
我正在使用的代码
result <- df_2 %>%
dplyr::inner_join(df_1, by = c("nodeA" = "query", "nodeB" = "target")) %>%
dplyr::mutate(GROUP = 1) %>%
dplyr::union(df_2 %>%
dplyr::inner_join(df_1, by = c("nodeB" = "query", "nodeA" = "target")) %>%
dplyr::mutate(GROUP = 2)) %>%
mutate(label=1)
我得到的输出
nodeA nodeB new_ssp ssp GROUP label
1 ID_1 ID_2 0.50 0.50 1 1
2 ID_3 ID_4 0.80 0.80 1 1
3 ID_3 ID_2 0.90 0.90 2 1
4 ID_1 ID_6 0.09 0.09 2 1
预期输出(这里,? 表示我不知道。可以是 1 或 2 无关紧要)
nodeA nodeB new_ssp ssp GROUP label
1 ID_1 ID_2 0.50 0.50 1 1
2 ID_3 ID_4 0.80 0.80 1 1
3 ID_3 ID_2 0.90 0.90 2 1
4 ID_1 ID_6 0.09 0.09 2 1
5 ID_4 ID_5 0.70 0.70 ? 0
6 ID_40 ID_50 0.70 0.70 ? 0
7 ID_5 ID_3 0.50 0.50 ? 0
8 ID_15 ID_31 0.50 0.50 ? 0
可重现的数据
query <- c("ID_1", "ID_2", "ID_3", "ID_4", "ID_5", "ID_6")
target <- c("ID_2", "ID_3", "ID_4", "ID_5", "ID_3", "ID_1")
ssp <- c(0.5, 0.9, 0.8, 0.7, 0.5, 0.09)
df_1 <- data.frame(query, target, ssp)
nodeA <- c("ID_1", "ID_3", "ID_3", "ID_40", "ID_15", "ID_1")
nodeB <- c("ID_2", "ID_2", "ID_4", "ID_50", "ID_31", "ID_6")
new_ssp <- c(0.5, 0.9, 0.8, 0.7, 0.5, 0.09)
df_2 <- data.frame(nodeA, nodeB, new_ssp)
我不是 100% 确定我理解你的问题,但似乎你想要一个复合标识符而不是 2 个单独的标识符。
获得此信息的一种方法是根据其他两个标识符创建一个唯一标识符,方法是在按字母顺序排序后粘贴它们。
这在https://stackoverflow.com/a/63698432/3888000 中有解释。
然后,您只需要使用 afull_join()
并根据缺失值创建标签(如果需要,您可以合并)。
这是一些代码:
library(tidyverse)
df_1_bis = df_1 %>%
mutate(col1 = pmin(query, target), col2 = pmax(query, target),
id = paste(col1, col2, sep="__")) %>%
select(-col1, -col2)
df_2_bis = df_2 %>%
mutate(col1 = pmin(nodeA, nodeB), col2 = pmax(nodeA, nodeB),
id = paste(col1, col2, sep="__")) %>%
select(-col1, -col2)
df_2_bis %>%
dplyr::full_join(df_1_bis, by = "id") %>%
select(id, ssp, new_ssp) %>%
mutate(label=ifelse(is.na(ssp) | is.na(new_ssp), "uncommon", "common")) %>%
separate(id, into=c("nodeA", "nodeB"), sep="__")
#> nodeA nodeB ssp new_ssp label
#> 1 ID_1 ID_2 0.50 0.50 common
#> 2 ID_2 ID_3 0.90 0.90 common
#> 3 ID_3 ID_4 0.80 0.80 common
#> 4 ID_4 ID_5 NA 0.70 uncommon
#> 5 ID_3 ID_5 NA 0.50 uncommon
#> 6 ID_1 ID_6 0.09 0.09 common
#> 7 ID_40 ID_50 0.70 NA uncommon
#> 8 ID_15 ID_31 0.50 NA uncommon
由reprex 包(v1.0.0)于 2021 年 3 月 31 日创建
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句