在R中解析变异数据

时间:2019-07-01 14:53:09

标签: r

我对解析一些突变数据很感兴趣,但是却在努力采用不同的方法来适应每种可能性。我有以下示例突变数据字符串:

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

,我想创建一个简单的数据,从中可以解析出引用(第一个字母),数字位置和替代形式。例如,如果我们查看第一个条目,则Ref将为'S',位置将为267,Alt将为P。任何创建通用函数以将它们匹配并拆分成各自的最佳方法的任何想法组,等等。我尝试了grep和stringer,但无法将所有三块分开,等等。

2 个答案:

答案 0 :(得分:3)

1)捕获假定第一个字段是非数字(\\D+),第二个字段是数字(\\d+),第三个字段是非数字({ {1}}),我们可以从基数R使用\\D+。如果我们知道字段是固定宽度的,我们可以改用模式stracapture

(.)(...)(.)

提供此data.frame:

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

1a)read.pattern {gsubfn软件包中的 Ref Pos Alt 1 S 267 P 2 W 290 * 3 K 650 Q 与使用相同模式的read.pattern解决方案有些相似,但不需要显式键入字段。它给出相同的输出。 strcapture在(1)中定义。

pat

2)read.table 使用与(1)相同的假设,我们可以在数字部分的任一侧插入一个空格,然后使用library(gsubfn) read.pattern(text = muts, pattern = pat, as.is = TRUE, col.names = c("Ref", "Pos", "Alt")) 进行读取。这也是提供与上述相同输出的基本解决方案。

read.table

3)read.fwf 假定字段是固定宽度的,我们可以使用基数R中的read.table(text = sub("(\\d+)", " \\1 ", muts), as.is = TRUE, col.names = c("Ref", "Pos", "Alt")) 。输出与上面相同。不使用正则表达式。

read.fwf

给予:

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

4)substr 另一个使用与(3)相同的假设并提供与上述相同的输出的基本解决方案是:

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

5)分开假设字段位于固定位置,我们可以使用tidyr软件包的data.frame(Ref = substr(muts, 1, 1), Pos = as.integer(substr(muts, 2, 4)), Alt = substr(muts, 5, 5), stringsAsFactors = FALSE) 。同样,不使用任何正则表达式。

separate

给予:

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

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

答案 1 :(得分:1)

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+)")