如果没有公共分隔符,如何拆分字符串

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 使用。