R:根据跨三个不同列的映射值合并两个数据框

时间:2020-06-20 02:49:29

标签: r merge

我有两个数据框,我试图根据MarkerName,Allele1和Allele2合并它们。我的问题是等位基因1和等位基因2列有时可能会翻转并且情况不同(即下面两个示例中的第1行)。另外,有时可以复制MarkerName(第3行和第4行)。

以下是示例:

 MarkerName  id     Allele1 Allele2
1: 1:752721  rs3131972  A  G
2: 1:791853  rs6684487  G  A
3: 1:834056 rs28482280  A  C
4: 1:834056 rs28482282  A  CAC
5: 1:834059 rs28482242  A  C,G


   MarkerName Allele1 Allele2  Effect 
1:   1:752721       g       a -0.0018 
2:   1:791853       g       a  0.0408 
3:   1:834056       a       c  0.0079 

是否可以将id列添加到R中的第二个数据帧?所以最终看起来像这样:

   MarkerName Allele1 Allele2  Effect id
1:   1:752721       g       a -0.0018 rs3131972
2:   1:791853       g       a  0.0408 rs6684487
3:   1:834056       a       c  0.0079 rs28482280



1 个答案:

答案 0 :(得分:2)

您可以使用Allele1Allele2pminpmax中的数据进行排序,使用separate_rows来获取不同行中的数据并将其联接。

library(dplyr)

df1 %>%
   tidyr::separate_rows(Allele2) %>%
   mutate(col1 = tolower(pmin(Allele1, Allele2)), 
          col2 = tolower(pmax(Allele1, Allele2))) %>%
   right_join(df2 %>%
               mutate(col1 = tolower(pmin(Allele1, Allele2)), 
                      col2 = tolower(pmax(Allele1, Allele2))),  
                by = c('MarkerName', 'col1', 'col2')) %>%
    select(MarkerName, id, Allele1 = Allele1.y, Allele2 = Allele2.y, Effect)


#  MarkerName         id Allele1 Allele2  Effect
#1   1:752721  rs3131972       g       a -0.0018
#2   1:791853  rs6684487       g       a  0.0408
#3   1:834056 rs28482280       a       c  0.0079