R: объединение двух фреймов данных на основе сопоставления значений в трех разных столбцах - PullRequest
1 голос
/ 20 июня 2020

У меня есть два фрейма данных, и я пытаюсь объединить их на основе 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 Ответ

1 голос
/ 20 июня 2020

Вы можете отсортировать данные в Allele1 и Allele2, используя pmin и pmax, используйте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...