данные
df <- read.table(text =
"SampleID Chrom Start End ID
HSB275 chr1 243216377 243219494 ENST00000366542|ENSG00000143702|protein_coding|protein_coding,chr1,243216377,243219494;ENST00000366543|ENSG00000143702|protein_coding|protein_coding,chr1,243216377,243219494
HSB274 chr10 952208 979839 ENST00000381466|ENSG00000205740|antisense|processed_transcript,chr10,971146,979839
HSB272 chr10 1046378 1047984 ENST00000381344|ENSG00000067064|protein_coding|protein_coding,chr10,1046378,1047984;ENST00000491735|ENSG00000067064|processed_transcript|protein_coding,chr10,1046378,1047984;ENST00000427898|ENSG00000067064|protein_coding|protein_coding,chr10,1046378,1047984
HSB481 chr11 654157 655184 ENST00000527170|ENSG00000177030|nonsense_mediated_decay|protein_coding,chr11,654157,655184", header = T)
мое решение
Я определяю две функции, которые могут пригодиться в будущем и решить эту задачу:
Первый, extract_matches
, извлекает все совпадения для каждого элемента в str.vec
.Возвращает список всех совпадающих подстрок, соответствующих шаблону.Он переносит gregexpr
, который возвращает только информацию о положении для совпадений.
Второй, extract_matches_aggregating
, всегда возвращает вектор, поскольку он объединяет все найденные совпадения, используя sep=
.Это зависит от extract_matches
.
. Эти две функции используются для извлечения всех идентификаторов ENSG и связывания их с помощью ",".
extract_matches <- function(pattern, str.vec) {
Map(function(m, s) substring(s, m, m + attr(m, "match.length") - 1), gregexpr(pattern, str.vec), str.vec)
}
extract_matches_aggregating <- function(pattern, str.vec, sep = "; ") {
sapply(extract_matches(pattern, str.vec), function(res_vec) {
paste(res_vec, collapse = sep)})
}
df$ID <- extract_matches_aggregating(pattern = "ENSG\\d+", str.vec = df$ID, sep = ", ")
df
- это:
SampleID Chrom Start End
1 HSB275 chr1 243216377 243219494
2 HSB274 chr10 952208 979839
3 HSB272 chr10 1046378 1047984
4 HSB481 chr11 654157 655184
ID
1 ENSG00000143702, ENSG00000143702
2 ENSG00000205740
3 ENSG00000067064, ENSG00000067064, ENSG00000067064
4 ENSG00000177030
Это решение будет быстрее на больших таблицах, чем любое решение, использующее strsplit
и sapply
и lapply
.