如何从 R 中的两个 df 获取常见(反之亦然)和不常见的行

0知识

我有 2 个数据框。现在,我想获取这两个数据帧的常见行和不常见行。

在这里,公共行可以是vice versa. 这意味着我正在搜索两个数据集之间的共同点,这些数据集可以按照匹配列的顺序发生变化。例如,row number 2df_1ID_2 ID_3df_2ID_3 ID_2它们在列值方面并不常见,但如果我们不考虑列值,它们是常见的。

获得 common 和 uncommon 后,我想添加另一列label作为1 for commonand 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在SQL的两个表中获取具有不常见值的行?

如何从两个不同对象列表中获取不常见对象

R:如何在df中的5个变量中按行查找10个最常见的对

如何使用Shell脚本在两个文本文件之间找到不常见的行?

如何仅使用OSX中的终端命令从两个文件中查找不常见的单词?

如何在R中找到两个常见的同音

如何在Swift中获取2个数组的不同(不常见)项目的列表

如何从两个文件中提取不常见的不区分大小写的文本?

如何找到两个大型数据帧之间不常见的日期时间

如何在两个不同的数据列之间提取不常见的数据?

如何在Ruby中的两个单独的字符串之间返回不常见的字符?

如何删除 Pandas 中两个数据框中的不常见列?

如何基于r中两个df的条件求和另一个df中的值?

如何通过R中的值(不加入)来匹配两个df?

比较两个数据框列并从df1打印不常见的值

如何导出两个数据帧之间不常见的记录列表?

如何在R中交换两个表的行

如何忽略两个表中常见的字段

从两个列表中获取不常见的元素-KOTLIN

如何在R中按行查找最常见的布尔变量组合

删除两个文件中不常见的行,但保持文件结构

如何计算R中字符的常见对象

尝试基于两个常见列合并R中的多个tsv文件

如何通过查找常见事件来获取两个 txt 文件?

从两个数据框中获取 R 中的常见列名

从R中的2个数据帧中删除不常见的列

如何识别两个熊猫数据框中的常见元素

从R中的2个数据帧中提取不常见的值

如何比较两个数组并打印公共数据和选中的复选框以及不常见的数据和未选中的复选框?