Как извлечь одно или несколько слов из строки и искать их в двух разных столбцах из другого файла в R - PullRequest
0 голосов
/ 14 июля 2020

Мне нужно найти, какие строки df1 присутствуют в df2, извлекая слова после "gene_id" в df1 $ Id и ища их в двух разных столбцах df2 (df2 $ Gene.id, df2 $ Gene.name ).

Вот как выглядят мои данные:

df1 <- data_frame(
  Chr = c("NC_035077.1", "NC_035078.1", "NC_035083.1", "NC_035083.1", "NC_035084.1", "NC_035084.1", "NC_035088.1"),
  Pos = c("61344375", "78462810", "24378412", "24387264","66360216", "66360385","40131947"),
  Var=c("tco","born", "tco","tco", "born","tco","tco"),
  Id=c("gene_id calm2", "gene_id LOC110500174", "gene_id ahcy", "gene_id ahcy", "gene_id cebpd", "gene_id cebpd", "gene_id LOC110537636, gene_id hsc70a")
  )

df1
Chr         Pos      Var   Id                                  
  <chr>       <chr>    <chr> <chr>                               
1 NC_035077.1 61344375 tco   gene_id calm2                       
2 NC_035078.1 78462810 born  gene_id LOC110500174                
3 NC_035083.1 24378412 tco   gene_id ahcy                        
4 NC_035083.1 24387264 tco   gene_id ahcy                        
5 NC_035084.1 66360216 born  gene_id cebpd                       
6 NC_035084.1 66360385 tco   gene_id cebpd                       
7 NC_035088.1 40131947 tco   gene_id LOC110537636, gene_id hsc70a


df2 <- data_frame(
  Gene.id = c("LOC110488122", "NA", "LOC110490243", "LOC110537256", "LOC100136165", "LOC100379112", "LOC100379114", "LOC110527949", "LOC110537636"),
  Gene.name = c("agr2", "agrn", "ahcy", "akap1","cebpb", "cebpb","cebpd", "ddost","slc6a13")
  )
 
df2
 Gene.id      Gene.name
  <chr>        <chr>    
1 LOC110488122 agr2     
2 NA           agrn     
3 LOC110490243 ahcy     
4 LOC110537256 akap1    
5 LOC100136165 cebpb    
6 LOC100379112 cebpb    
7 LOC100379114 cebpd    
8 LOC110527949 ddost    
9 LOC110537636 slc6a13

Как вы можете видеть, у некоторых идентификаторов df1 $ есть два gene_id, мне нужно проверить их оба в df2, и какой из они совпадают с df2 $ Gene.id или df2 $ Gene.name, мне нужно включить эту строку в выходной файл. Также в df2 есть несколько НА.

Мой результат должен выглядеть так:

Chr         Pos      Var   Id                                    Gene.id       Gene.name                                
NC_035083.1 24378412 tco   gene_id ahcy                          LOC110490243  ahcy
NC_035083.1 24387264 tco   gene_id ahcy                          LOC110490243  ahcy
NC_035084.1 66360216 born  gene_id cebpd                         LOC100379114  cebpd 
NC_035084.1 66360385 tco   gene_id cebpd                         LOC100379114  cebpd
NC_035088.1 40131947 tco   gene_id LOC110537636, gene_id hsc70a  LOC110537636  slc6a13

Мы будем очень признательны за любую помощь в том, как этого добиться.

1 Ответ

1 голос
/ 14 июля 2020

Это помогло на вашем примере. Я предполагаю, что все ваши данные имеют один и тот же формат.

Вам нужно будет создать чистый столбец «все в», чтобы соединить df1 с df2. После выполнения двух объединений очистите ненужные строки и обновите значения NA s, используя столбец «все в».

По шагам

  1. Создайте новый столбец для разделения.
  2. Разделите строки несколькими значениями.
  3. Удалите "gene_id", чтобы можно было присоединить чистый столбец "все в".
  4. Присоединяйтесь по одному столбцу, затем по другой. Порядок не имеет значения.
  5. Отфильтровать строки без совпадений.
  6. Обновите NA s
  7. Удалите new_col, потому что он вам больше не нужен

Код

library(stringr) # for str_remove()
library(tidyr) # for separate_rows()
library(dplyr) # for everything else

df1 %>% 
  mutate(new_col = Id) %>% 
  separate_rows(new_col, sep = ", ") %>% 
  mutate(new_col = str_remove(new_col, "gene_id ")) %>% 
  left_join(df2, by = c("new_col" = "Gene.name")) %>% 
  left_join(df2, by = c("new_col" = "Gene.id")) %>% 
  filter(!is.na(Gene.name) | !is.na(Gene.id)) %>% 
  mutate(Gene.name = if_else(is.na(Gene.name), new_col, Gene.name),
         Gene.id = if_else(is.na(Gene.id), new_col, Gene.id)) %>% 
  select(-new_col)
  
  Chr         Pos      Var   Id                                   Gene.id      Gene.name
  <chr>       <chr>    <chr> <chr>                                <chr>        <chr>    
1 NC_035083.1 24378412 tco   gene_id ahcy                         LOC110490243 ahcy     
2 NC_035083.1 24387264 tco   gene_id ahcy                         LOC110490243 ahcy     
3 NC_035084.1 66360216 born  gene_id cebpd                        LOC100379114 cebpd    
4 NC_035084.1 66360385 tco   gene_id cebpd                        LOC100379114 cebpd    
5 NC_035088.1 40131947 tco   gene_id LOC110537636, gene_id hsc70a LOC110537636 slc6a13
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...