Регулярное выражение, чтобы поймать все возможности?

Мой вклад - это генетические данные, которые выглядят так:

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=" "))
Другие вопросы по тегам