Выберите уникальные значения - PullRequest
0 голосов
/ 01 октября 2018

Мне нужно изменить эту функцию, которая не соответствует уникальным значениям.Например, если я хочу MAPK4, функция соответствует MAPK41, AMAPK4 и т. Д. Функция должна выбирать только уникальные значения.

Функция:

library(dplyr)

df2 <- df %>% 
  rowwise() %>%
  mutate(mutated = paste(mutated_genes[unlist(
    lapply(mutated_genes, function(x) grepl(x,genes, ignore.case = T)))], collapse=","),
    circuit_name = gsub("", "", circuit_name)) %>%
  select(-genes) %>%
  data.frame()

data:

df <-structure(list(circuit_name = c("hsa04010__117", "hsa04014__118" ), genes = c("MAP4K4,DUSP10*,DUSP10*,DUSP10*,DUSP10*,DUSP10*,DUSP10*,DUSP10*,DUSP10*,DUSP10*,DUSP10*,DUSP3*,DUSP3*,DUSP3*,DUSP3*,PPM1A,AKT3,AKT3,AKT3,ZAK,MAP3K12,MAP3K13,TRAF2,CASP3,IL1R1,IL1R1,TNFRSF1A,IL1A,IL1A,TNF,RAC1,RAC1,RAC1,RAC1,MAP2K7,MAPK8,MAPK8,MAPK8,MECOM,HSPA1A,HSPA1A,HSPA1A,HSPA1A,HSPA1A,HSPA1A,MAP4K3,MAPK8IP2,MAP4K1",  "MAP4K4,DUSP10*,DUSP10*,DUSP10*,DUSP10*,DUSP10*")), class = "data.frame", row.names = c(NA,  -2L))  
mutated_genes <- c("MAP4K4", "MAP3K12","TRAF2", "CACNG3")

вывод:

  circuit_name      mutated
1  hsa04010__117 MAP4K4,TRAF2
2  hsa04014__118       MAP4K4

Ответы [ 3 ]

0 голосов
/ 01 октября 2018

Базовый подход R заключался бы в разделении genes на "," и возврате те строки, которые соответствуют mutated_genes.

df$mutated <- sapply(strsplit(df$genes, ","), function(x) 
   toString(grep(paste0(mutated_genes, collapse = "|"), x, value = TRUE)))

df[c(1, 3)]
#   circuit_name                mutated
#1 hsa04010__117 MAP4K4, MAP3K12, TRAF2
#2 hsa04014__118                 MAP4K4
0 голосов
/ 01 октября 2018

Мы можем использовать str_extract

library(stringr)
df$mutated <- sapply(str_extract_all(df$genes, paste(mutated_genes, 
         collapse="|")), toString)
0 голосов
/ 01 октября 2018

Обратите внимание, что на основе вектора mutated_genes ваш ожидаемый результат отсутствует MAP3K12 для hsa04010__117.

Вот tidyverse возможность

df %>%
    separate_rows(genes) %>%
    filter(genes %in% mutated_genes) %>%
    group_by(circuit_name) %>%
    summarise(mutated = toString(genes))
## A tibble: 2 x 2
#  circuit_name  mutated
#  <chr>         <chr>
#1 hsa04010__117 MAP4K4, MAP3K12, TRAF2
#2 hsa04014__118 MAP4K4

Объяснение: Мы разделяем разделенные запятыми записи на разные строки, затем выбираем только те строки, где genes %in% mutated_genes, и суммируем результаты по circuit_name путем объединения genes записей.


PS.Лично я бы рекомендовал хранить данные в чистом длинном формате (т.е. не объединять записи с toString);Таким образом, у вас будет по одной строке на ген, что сделает любую последующую обработку данных намного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...