Как создать столбец со значениями, зависящими от других столбцов в r?

#r

#r

Вопрос:

У меня есть набор данных клинических испытаний, для которых я хочу создать столбец генов — генов, соответствующих клиническому испытанию, в котором они появляются.

Мой набор данных выглядит так:

 Study ID   Title                             Drug        
1         Study of placement              BRCA2-drug
2         Study of ACE                    Gene1-drug
3         Another ACE study               Gene2-drug
4         Study of NOS3 and ACE            ACE-drug
  

(Просто чтобы отметить, что в моих реальных данных у меня есть еще много столбцов, в которых может отображаться имя гена)

Затем у меня есть список генов:

 Gene
ACE
BRCA2
NOS3
HER2
  

Я хочу создать столбец в моем первом наборе данных, соответствующий гену для изучения, выводя, например:

 Gene      Study ID      Title                             Drug        
BRCA2         1         Study of placement              BRCA2-drug
ACE           2         Study of ACE                    Gene1-drug
ACE           3         Another ACE study               Gene2-drug  
ACE, NOS3     4         Study of NOS3 and ACE            ACE-drug
  

Я не уверен, с чего начать с этого, особенно с создания столбца, который также позволяет строкам содержать несколько генов, если в этой строке появляется несколько генов. Я пытался использовать dplyr::group_by() , но не продвинулся далеко.

Входные данные:

 #Clinical trials data:
structure(list(StudyID = 1:4, Title = c("Study of placement", 
"Study of ACE", "Another ACE study", "Study of NOS3 and ACE"), Drug = c("BRCA2-drug", 
"Gene1-drug", "Gene2-drug","ACE-drug")), row.names = c(NA, -4L), class = c("data.table", 
"data.frame"))

#Gene list:
structure(list(Gene = c("ACE", "NOS3", "HER2", "BRCA1")), row.names = c(NA, 
-4L), class = c("data.table", "data.frame"))
  

Ответ №1:

Вы можете создать шаблон, объединяющий все гены вместе. Из нескольких столбцов извлеките присутствующие гены и объедините их в один столбец.

 library(dplyr)
pat <-  paste0(gene_list$Gene, collapse = '|')

trials %>%
  mutate(across(.fns = ~str_extract_all(., pat), .names = '{col}_new')) %>% 
  rowwise() %>%
  mutate(Gene = toString(unique(unlist(c_across(ends_with('_new')))))) %>%
  select(-ends_with('new'))

#   StudyID Title                 Drug       Gene     
#    <int> <chr>                 <chr>      <chr>    
#1       1 Study of placement    BRCA2-drug BRCA2    
#2       2 Study of ACE          Gene1-drug ACE      
#3       3 Another ACE study     Gene2-drug ACE      
#4       4 Study of NOS3 and ACE ACE-drug   NOS3, ACE
  

Обратите внимание, что ваши данные не имеют "BRCA2" . Я изменил "BRCA1" на "BRCA2" .