Анализ данных мутации в R - PullRequest
0 голосов
/ 01 июля 2019

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

muts=c("S267P", "W290*","K650Q")

, и я хотел бы создать простые данные, из которых будут проанализированы ссылка (первая буква), числовое положение и альтернативная форма.Например, если мы посмотрим на первую запись, ссылка будет 'S', позиция будет 267, а Alt будет P. Любые идеи - лучший способ создать универсальную функцию для сопоставления и разделения их на соответствующие.группы и т. д. Я пробовал grep и stringr, но у меня были проблемы с разделением всех трех частей и т. д.

Ответы [ 2 ]

3 голосов
/ 01 июля 2019

1) strcapture Предполагая, что первое поле не числовое (\\D+), второе - числовое (\\d+), а третье не числовое (\\D+), мы можем используйте stracapture из базы R. Если бы мы знали, что поля имеют фиксированную ширину, мы могли бы использовать шаблон (.)(...)(.) вместо.

# pat <- "(.)(...)(.)"  # alternative if fields fixed width
pat <- "(\\D+)(\\d+)(\\D+)"
strcapture(pat, muts, list(Ref = character(0), Pos = integer(0), Alt = character(0)))

предоставление этих данных. Кадр:

  Ref Pos Alt
1   S 267   P
2   W 290   *
3   K 650   Q

1a) read.pattern read.pattern в пакете gsubfn чем-то напоминает решение strcapture, использующее тот же шаблон, но не требующее явной типизации полей. Это дает тот же результат. pat определено в (1).

library(gsubfn)
read.pattern(text = muts, pattern = pat, as.is = TRUE, 
  col.names = c("Ref", "Pos", "Alt"))

2) read.table Используя те же предположения, что и (1), мы можем вставить пробел с любой стороны числовой части и затем прочитать его, используя read.table. Это также базовое решение, дающее тот же результат, что и выше.

read.table(text = sub("(\\d+)", " \\1 ", muts), as.is = TRUE,
  col.names = c("Ref", "Pos", "Alt"))

3) read.fwf Предполагая, что поля имеют фиксированную ширину, мы можем использовать read.fwf от базы R. Вывод такой же, как и выше. Регулярные выражения не используются.

read.fwf(textConnection(muts), c(1, 3, 1), as.is = TRUE,
  col.names = c("Ref", "Pos", "Alt"))

дает:

  Ref Pos Alt
1   S 267   P
2   W 290   *
3   K 650   Q

4) substr Еще одно базовое решение, использующее те же допущения, что и (3), и выдающее тот же результат, что и выше:

data.frame(Ref = substr(muts, 1, 1),
  Pos = as.integer(substr(muts, 2, 4)),
  Alt = substr(muts, 5, 5),
  stringsAsFactors = FALSE)

5) отдельное Предполагая, что поля находятся в фиксированных положениях, мы можем использовать пакет тидира separate. Опять же, регулярные выражения не используются.

library(dplyr)
library(tidyr)
library(tibble)

tibble(muts) %>%
  separate(muts, into = c("Ref", "Pos", "Alt"), sep = c(1, 4, 5))

дает:

# A tibble: 3 x 3
  Ref   Pos   Alt  
  <chr> <chr> <chr>
1 S     267   P    
2 W     290   *    
3 K     650   Q    
1 голос
/ 01 июля 2019

1) Не ясно, ожидаемый результат, мы можем создать разделитель и затем разделить с помощью read.csv

read.csv(text = sub("(\\D+)(\\d+)(\\D+)$", "\\1,\\2,\\3", muts),
       header = FALSE, col.names = c("Ref", "Pos", "Alt"))
#    Ref Pos Alt
#1   S 267   P
#2   W 290   *
#3   K 650   Q

2) Или другой вариант с strsplit

type.convert(as.data.frame(do.call(rbind, 
    strsplit(muts,  "(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)", perl = TRUE))))

3) Или другой вариант - поиск по регулярному выражению (который также будет охватывать различное количество символов)

library(tidyverse)
tibble(muts) %>%
   separate(muts, into = c("Ref", "Pos", "Alt"), "(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)")
# A tibble: 3 x 3
#  Ref   Pos   Alt  
#  <chr> <chr> <chr>
#1 S     267   P    
#2 W     290   *    
#3 K     650   Q    

4) Или мы можем использовать extract

tibble(muts) %>%
   extract(muts, into = c("Ref", "Pos", "Alt"), "(\\D+)(\\d+)(\\D+)")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...