Регулярное выражение, чтобы поймать все возможности?
Мой вклад - это генетические данные, которые выглядят так:
SNP VALUE
rs123456 A/G
rs345353 del/CTT
rs343524 T
rs243224 T/del
....
Не углубляясь в генетику, у всех нас есть 2 аллеля (мама и папа), так что если у вас есть одно значение без "/" (A/C/G/T/del/CTT), это означает, что оба аллеля одинаковы, если нет, есть косая черта "/", чтобы показать, что они разные.
Короче говоря, мне нужно найти известные шаблоны SNP, но я понимаю, что существует много возможностей (если количество значений / (сокращенных) велико).
Я уже построил регулярное выражение, как это: [A|C|G|T|del|CTT]
,
A/G = G/A, поэтому мне нужно соответствовать всем возможностям.
Есть ли какая-либо функция или логика, которая может помочь мне сделать это? Пожалуйста, порекомендуйте.
PS
Добавление дополнительной информации:
Ожидаемый результат - это все возможные варианты значений, например:
rs123 = A/G, rs456 = T/C, rs789 = CTT:
Option 1: A T CTT;
Option 2: A C CTT;
Option 3: G T CTT;
Option 4: G C CTT;
но если у меня есть больше, чем 2 / я хочу получить все варианты.
1 ответ
Если я правильно понимаю, вы после этого:
df = data.frame(SNP = c("rs123456", "rs345353", "rs343524" ,"rs243224"),
value = c("A/G", "del/CTT", "T", "T/del"), stringsAsFactors = F)
expand.grid(strsplit(df$value, "/"))
#output
Var1 Var2 Var3 Var4
1 A del T T
2 G del T T
3 A CTT T T
4 G CTT T T
5 A del T del
6 G del T del
7 A CTT T del
8 G CTT T del
или если для каждой комбинации требуется строка
apply(expand.grid(strsplit(df$value, "/")), 1, paste, collapse = " ")
#output
[1] "A del T T" "G del T T" "A CTT T T" "G CTT T T" "A del T del" "G del T del"
[7] "A CTT T del" "G CTT T del"
или же:
do.call(paste, c(expand.grid(strsplit(df$value, "/")), sep=" "))