1) sub 和 gsub 使用sub 和gsub 在问题中尝试这个。请注意,每个正则表达式都应该匹配所有的dat$Details,这样当我们用捕获组替换它时,只剩下捕获组。对于问题的 cmets 中的 dat$GO,我们删除了直到但不包括 P: 的所有内容,用逗号替换所有出现的 ;P 并删除 P: 并删除分号和之后的所有内容。 F 和 C 也是如此:
data.frame(dat[1],
Description = sub(" .*", "", dat$Details),
gn = sub(".*gn=(.*) os=.*", "\\1", dat$Details),
os = sub(".*os=(.*) p=.*", "\\1", dat$Details),
P = gsub("P:|;.*", "", gsub(";P:", ",", sub(".*?P:", "P:", dat$GO))),
F = gsub("F:|;.*", "", gsub(";F:", ",", sub(".*?F:", "F:", dat$GO))),
C = gsub("C:|;.*", "", gsub(";C:", ",", sub(".*?C:", "C:", dat$GO))))
给予:
ID Description gn os P F C
1 id_1 box1_homodomain box1 homo sapiens p_1,p_2 F_1 C_1,C_2
2 id_2 sox2_plurinet plu mus musculus p_1 F_1,F_2 C_1
2) read.pattern 使用read.pattern (link) 在gsubfn package 中处理dat$Details 会更容易一些,因为可以定义一个单个 正则表达式,其捕获组代表感兴趣的领域。 dat$GO 的处理也可以通过使用strapplyc(link) 提取P:... 字段,然后将它们与paste 连接在一起来简化(与F 和C 字段类似):
library(gsubfn)
Sub <- function(string, pat) sapply(strapplyc(string, pat), paste, collapse = ",")
DF <- read.pattern(text = as.character(dat$Details),
pattern = "(.*) gn=(.*) os=(.*) p=",
col.names = c("Description", "gn", "os"),
as.is = TRUE)
cbind(dat[1], DF,
P = Sub(dat$GO, "P:(.*?);"),
F = Sub(dat$GO, "F:(.*?);"),
C = Sub(dat$GO, "C:(.*?);"))
给予:
ID Description gn os P F C
1 id_1 box1_homodomain box1 homo sapiens p_1,p_2 F_1 C_1,C_2
2 id_2 sox2_plurinet plu mus musculus p_1 F_1,F_2 C_1
这是read.pattern中使用的正则表达式的可视化:
(.*) gn=(.*) os=(.*) p=
Debuggex Demo
备注
1) 如果dat$Details 列已经是字符,我们可以省略as.character。如果可以在结果中包含 factor 列,我们也可以省略 as.is=TRUE。
2) 问题中的示例输出为mouse,但输入为mus。我们假设在这两种情况下都应该是mus。
3) 我们将其用于dat:
dat <-
structure(list(ID = c("id_1", "id_2"),
Details = c("box1_homodomain gn=box1 os=homo sapiens p=4 se=1",
"sox2_plurinet gn=plu os=mus musculus p=5 se=3"),
GO = c("P:p_1;P:p_2;F:F_1;C:C_1;C:C_2; ",
"P:p_1;F:F_1;F:F_2;C:C_1;")), .Names = c("ID", "Details",
"GO"), class = "data.frame", row.names = c(NA, -2L))
以后请在问题中发布dput(dat)的结果。