Подсчет общих слов между строками в двух столбцах фрейма данных - PullRequest
1 голос
/ 05 августа 2020

У меня есть два столбца в таблице, содержащие списки генов в качестве символов, например,

x <- data.frame("Patient" = 1:3, "Genes1" = c("EGFR; TP53; BRCA1","CDK1; CD274; PARP1","MAP2K1; MAP2K2; PIK3CA"), "Genes2" = c("EGFR; TP53; MAP2K1; VEGF", NA,"MAP2K1; MTOR"))

I wi sh, чтобы создать новый столбец с подсчетом количества общих генов между другими столбцами для соответствующая строка. Я пытаюсь сделать это в R, разбивая символы в список и подсчитывая общие элементы:

x <- x %>% mutate(Count = length(intersect(strsplit(Genes1, "; ")[[1]], strsplit(Genes2, "; ")[[1]])))

или

x$Count1 <- length(intersect(strsplit(x$Genes1, "; ")[[1]], strsplit(x$Genes2, "; ")[[1]]))

, но это возвращает "2" для каждой строки, а чем указанная строка c результат, который я хочу, это будет

 x <- data.frame("Patient" = 1:3, "Genes1" = c("EGFR; TP53; BRCA1","CDK1; CD274; PARP1","MAP2K1; MAP2K2; PIK3CA"), "Genes2" = c("EGFR; TP53; MAP2K1; VEGF", NA,"MAP2K1; MTOR"), Count = c(2,0,1))

Любые указатели?

1 Ответ

0 голосов
/ 05 августа 2020

Можно разделить столбцы с помощью strsplit, выполнить соответствующую проверку элемента list с помощью map2 с intersect и получить lengths элементов intersect ing

library(dplyr)
library(purrr)
x %>% 
   mutate(Count = lengths(map2(strsplit(Genes1, ";\\s*"), 
                               strsplit(Genes2, ";\\s*"), intersect)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...