首页 > 解决方案 > 合并 R 中的两个 df,其中值可以在两列中交换(即 col1 可能存在于另一个 df 中的 col2 中)

问题描述

我正在尝试将两个数据框合并为两列,其中gene1 或gene2 的值可能位于任一列中

df1<-data.frame(gene_1=c('A','B','E'),
                gene_2=c('B','C','C'),
                value =c(0,1,1))

df2<-data.frame(gene_1=c('B','B','D'),
                gene_2=c('A','C','E'),
                value=c(1,0.5,1))

期望的结果是:

   result<-data.frame(gene_1=c('A','B','D','E'),
                      gene_2=c('B','C','E','C'),
                      value1=c(0, 1, NA, 1),
                      value2=c(1, 0.5, 1, NA))

它将合并两个dfs中的第一行gene1 = A,gene2 = B和gene1 = B和gene2 = A,因为gene1与gene2是任意的。

谢谢你

标签: rdataframejoinmerge

解决方案


您可以对两个数据集中的列进行排序gene_1gene_2然后执行full_join.

library(dplyr)

df1 %>%
  transmute(col1 = pmin(gene_1, gene_2), 
            col2 = pmax(gene_1, gene_2), 
            value1 = value) %>%
  full_join(df2 %>%
  transmute(col1 = pmin(gene_1, gene_2), 
            col2 = pmax(gene_1, gene_2), 
            value2 = value), 
  by = c('col1', 'col2'))


#  col1 col2 value1 value2
#1    A    B      0    1.0
#2    B    C      1    0.5
#3    C    E      1     NA
#4    D    E     NA    1.0

推荐阅读