如果没有公共分隔符,如何拆分字符串
How to split a string if there is no common delimiter
我有一个名为 headers.txt 的文本文件,其中包含多个 FASTA 输入。我必须将每个 header 拆分为包含 ID、序列名称、节点编号、序列长度和排序类型的单独列。他们每个人都应该在同一个数据框中自己单独的列中。
写出来如下(headers.txt)
NZ_MCQZ01000071.1:2282-2767 Klebsiella pneumoniae strain TR196 Scaffold45_1, whole genome shotgun sequence
RYOH01000117.1:3-590 Klebsiella pneumoniae strain 16WZ-131 NODE_117_length_2026_cov_233.332478, whole genome shotgun sequence
RYOJ01000145.1:3-857 Klebsiella pneumoniae strain 16WZ-128 NODE_145_length_2293_cov_224.091606, whole genome shotgun sequence
NZ_CABWRH010000049.1:1707-2128 Klebsiella pneumoniae strain SRRSH43 isolate SRRSH43, whole genome shotgun sequence
RYQS01000239.1:1916-2698 Klebsiella pneumoniae strain 16HN-12 NODE_239_length_2763_cov_7.539092, whole genome shotgun sequence
基于最后一个序列header的信息
ID: RYQS01000239.1:1916-2698
sequence name: Klebsiella pneumoniae strain 16HN-12
node number: NODE_239
sequence length: length_2763_cov_7.539092
sequencing type: whole genome shotgun sequence
我的问题是这些 .txt 文件可以包含数百个 FASTA 输入,例如这些文件,其中一些包含必要的信息,而另一些则不包含(例如,一些说明了长度,而另一些则没有),例如示例序列headers 以上给出。因此,如果未找到必要的数据,该列仍应生成但保持打开状态。
我试过使用 strsplit,但是我找不到适用于所有这些的定界符,这是我所得到的
library("Biostrings")
fastaFile <- readDNAStringSet("~/ex1/headers.txt")
seq_name = names(fastaFile)
df <- data.frame(seq_name)
library(stringr)
df[c('ID', 'Sequence name','Sequence length','Node number','Sequencing type')] <- str_split_fixed(df$seq_name, ' ', 5)
df <- df[c('ID', 'Sequencing name', 'Sequence length','Node number','Sequencing type')]
数据框应该是这样的
ID
Sequence name
Node number
Sequence length
Sequencing type
RYQS01000239.1:1916-2698
Klebsiella pneumoniae strain 16HN-12
NODE_239
length_2763_cov_7.539092
whole genome shotgun sequence
您可以使用一种 look-behind 到冒号加上一些文本直到 space。由于 (?<=:\w+-\w+)
由于长度不同而无法工作,我们可以使用 \K
在此时重置匹配。其他正则表达式很简单。
readLines('headers.txt') |>
{\(.) .[. != '']}() |>
strsplit(':\w+-\w+\K\s|\sNODE_|_length_|_cov_|,\s', perl=TRUE) |>
{\(.) lapply(., `length<-`, max(lengths(.)))}() |>
lapply(\(x) {g <- grepl('genome', x);if (any(g)) {x[length(x)] <- x[g]; x[g] <- NA};x}) |>
do.call(what='rbind.data.frame') |>
type.convert(as.is=TRUE) |>
setNames(c('ID', 'name', 'node', 'length', 'cov', 'type'))
# ID name node length cov type
# 1 NZ_MCQZ01000071.1:2282-2767 Klebsiella pneumoniae strain TR196 Scaffold45_1 NA NA NA whole genome shotgun sequence
# 2 RYOH01000117.1:3-590 Klebsiella pneumoniae strain 16WZ-131 117 2026 233.332478 <NA>
# 3 RYOJ01000145.1:3-857 Klebsiella pneumoniae strain 16WZ-128 145 2293 224.091606 <NA>
# 4 NZ_CABWRH010000049.1:1707-2128 Klebsiella pneumoniae strain SRRSH43 isolate SRRSH43 NA NA NA whole genome shotgun sequence
# 5 RYQS01000239.1:1916-2698 Klebsiella pneumoniae strain 16HN-12 239 2763 7.539092 <NA>
参见demo。
注意: R >= 4.1 使用。
我有一个名为 headers.txt 的文本文件,其中包含多个 FASTA 输入。我必须将每个 header 拆分为包含 ID、序列名称、节点编号、序列长度和排序类型的单独列。他们每个人都应该在同一个数据框中自己单独的列中。
写出来如下(headers.txt)
NZ_MCQZ01000071.1:2282-2767 Klebsiella pneumoniae strain TR196 Scaffold45_1, whole genome shotgun sequence
RYOH01000117.1:3-590 Klebsiella pneumoniae strain 16WZ-131 NODE_117_length_2026_cov_233.332478, whole genome shotgun sequence
RYOJ01000145.1:3-857 Klebsiella pneumoniae strain 16WZ-128 NODE_145_length_2293_cov_224.091606, whole genome shotgun sequence
NZ_CABWRH010000049.1:1707-2128 Klebsiella pneumoniae strain SRRSH43 isolate SRRSH43, whole genome shotgun sequence
RYQS01000239.1:1916-2698 Klebsiella pneumoniae strain 16HN-12 NODE_239_length_2763_cov_7.539092, whole genome shotgun sequence
基于最后一个序列header的信息
ID: RYQS01000239.1:1916-2698
sequence name: Klebsiella pneumoniae strain 16HN-12
node number: NODE_239
sequence length: length_2763_cov_7.539092
sequencing type: whole genome shotgun sequence
我的问题是这些 .txt 文件可以包含数百个 FASTA 输入,例如这些文件,其中一些包含必要的信息,而另一些则不包含(例如,一些说明了长度,而另一些则没有),例如示例序列headers 以上给出。因此,如果未找到必要的数据,该列仍应生成但保持打开状态。
我试过使用 strsplit,但是我找不到适用于所有这些的定界符,这是我所得到的
library("Biostrings")
fastaFile <- readDNAStringSet("~/ex1/headers.txt")
seq_name = names(fastaFile)
df <- data.frame(seq_name)
library(stringr)
df[c('ID', 'Sequence name','Sequence length','Node number','Sequencing type')] <- str_split_fixed(df$seq_name, ' ', 5)
df <- df[c('ID', 'Sequencing name', 'Sequence length','Node number','Sequencing type')]
数据框应该是这样的
ID | Sequence name | Node number | Sequence length | Sequencing type |
---|---|---|---|---|
RYQS01000239.1:1916-2698 | Klebsiella pneumoniae strain 16HN-12 | NODE_239 | length_2763_cov_7.539092 | whole genome shotgun sequence |
您可以使用一种 look-behind 到冒号加上一些文本直到 space。由于 (?<=:\w+-\w+)
由于长度不同而无法工作,我们可以使用 \K
在此时重置匹配。其他正则表达式很简单。
readLines('headers.txt') |>
{\(.) .[. != '']}() |>
strsplit(':\w+-\w+\K\s|\sNODE_|_length_|_cov_|,\s', perl=TRUE) |>
{\(.) lapply(., `length<-`, max(lengths(.)))}() |>
lapply(\(x) {g <- grepl('genome', x);if (any(g)) {x[length(x)] <- x[g]; x[g] <- NA};x}) |>
do.call(what='rbind.data.frame') |>
type.convert(as.is=TRUE) |>
setNames(c('ID', 'name', 'node', 'length', 'cov', 'type'))
# ID name node length cov type
# 1 NZ_MCQZ01000071.1:2282-2767 Klebsiella pneumoniae strain TR196 Scaffold45_1 NA NA NA whole genome shotgun sequence
# 2 RYOH01000117.1:3-590 Klebsiella pneumoniae strain 16WZ-131 117 2026 233.332478 <NA>
# 3 RYOJ01000145.1:3-857 Klebsiella pneumoniae strain 16WZ-128 145 2293 224.091606 <NA>
# 4 NZ_CABWRH010000049.1:1707-2128 Klebsiella pneumoniae strain SRRSH43 isolate SRRSH43 NA NA NA whole genome shotgun sequence
# 5 RYQS01000239.1:1916-2698 Klebsiella pneumoniae strain 16HN-12 239 2763 7.539092 <NA>
参见demo。
注意: R >= 4.1 使用。