#r
Вопрос:
Вот часть моего фрейма данных.
> df
Group Direction cytoband q value residual q value wide peak boundaries
V29 All DEL 11q25 7.78E-43 2.22E-39 chr11:130906630-135086622
V30 All DEL Xp22.11 3.01E-38 1.91E-35 chrX:23277186-26139553
V31 All DEL 10q23.31 3.61E-31 3.61E-31 chr10:87745632-87859602
V32 All DEL 22q12.3 4.03E-25 3.96E-25 chr22:33050952-34766503
V33 All DEL 11p15.4 6.59E-25 6.59E-25 chr11:3230287-3799554
Я хочу извлечь символ или число после «chr» в столбце «границы широких пиков». Я попробовал код ниже, но во второй строке получаются значения NA.
library(tidyr)
df <- extract(df, 'wide peak boundaries', into = c('chr', 'start', 'end'),
'(\d ) :(\d ) -(\d )', remove = F, convert = T)
df
Group Direction cytoband q value residual q value wide peak boundaries chr start end
V29 All DEL 11q25 7.78E-43 2.22E-39 chr11:130906630-135086622 11 130906630 135086622
V30 All DEL Xp22.11 3.01E-38 1.91E-35 chrX:23277186-26139553 NA NA NA
V31 All DEL 10q23.31 3.61E-31 3.61E-31 chr10:87745632-87859602 10 87745632 87859602
V32 All DEL 22q12.3 4.03E-25 3.96E-25 chr22:33050952-34766503 22 33050952 34766503
V33 All DEL 11p15.4 6.59E-25 6.59E-25 chr11:3230287-3799554 11 3230287 3799554
данные
structure(list(Group = c("All", "All", "All", "All", "All"),
Direction = c("DEL", "DEL", "DEL", "DEL", "DEL"), cytoband = c("11q25",
"Xp22.11", "10q23.31", "22q12.3", "11p15.4"), `q value` = c("7.78E-43",
"3.01E-38", "3.61E-31", "4.03E-25", "6.59E-25"), `residual q value` = c("2.22E-39",
"1.91E-35", "3.61E-31", "3.96E-25", "6.59E-25"), `wide peak boundaries` = c("chr11:130906630-135086622",
"chrX:23277186-26139553", "chr10:87745632-87859602", "chr22:33050952-34766503",
"chr11:3230287-3799554"), chr = c(11L, NA, 10L, 22L, 11L),
start = c(130906630L, NA, 87745632L, 33050952L, 3230287L),
end = c(135086622L, NA, 87859602L, 34766503L, 3799554L)), class = "data.frame", row.names = c("V29",
"V30", "V31", "V32", "V33"))
Ответ №1:
Идея состоит в том , чтобы разделить на :
и -
, но для chr
столбца вы не извлекаете строку «chr». Так что вы могли бы использовать:
(обновлено на основе комментария @Chris Ruehlemann)
df %>%
extract("wide peak boundaries",
into = c("chr", "start", "end"),
regex = "((?<=chr).*):(.*)-(.*)",
remove = FALSE)
что дает:
Group Direction cytoband q value residual q value wide peak boundaries chr start end
V29 All DEL 11q25 7.78E-43 2.22E-39 chr11:130906630-135086622 11 130906630 135086622
V30 All DEL Xp22.11 3.01E-38 1.91E-35 chrX:23277186-26139553 X 23277186 26139553
V31 All DEL 10q23.31 3.61E-31 3.61E-31 chr10:87745632-87859602 10 87745632 87859602
V32 All DEL 22q12.3 4.03E-25 3.96E-25 chr22:33050952-34766503 22 33050952 34766503
V33 All DEL 11p15.4 6.59E-25 6.59E-25 chr11:3230287-3799554 11 3230287 3799554
Комментарии:
1.Примечание:
[^chr]
соответствует любому символу, который неc
является ИЛИh
ИЛИr
в любом порядке. Чтобы действительно убедиться, что вы соответствуете строкеchr
, вам лучше использовать поисковый запрос:regex = "((?<=chr).*):(.*)-(.*)"
2. Ты прав. буду редактировать.
Ответ №2:
library(data.table)
setDT(mydata)[, c("chr", "start", "end") := tstrsplit(`wide peak boundaries`, "[:-]", perl = TRUE)]
Group Direction cytoband q value residual q value wide peak boundaries chr start end
1: All DEL 11q25 7.78E-43 2.22E-39 chr11:130906630-135086622 chr11 130906630 135086622
2: All DEL Xp22.11 3.01E-38 1.91E-35 chrX:23277186-26139553 chrX 23277186 26139553
3: All DEL 10q23.31 3.61E-31 3.61E-31 chr10:87745632-87859602 chr10 87745632 87859602
4: All DEL 22q12.3 4.03E-25 3.96E-25 chr22:33050952-34766503 chr22 33050952 34766503
5: All DEL 11p15.4 6.59E-25 6.59E-25 chr11:3230287-3799554 chr11 3230287 3799554
Ответ №3:
Вам нужно только изменить \d
первую группу захвата на \w
( \d
соответствует только цифрам, тогда \w
как соответствует буквенным символам и цифрам и подчеркиванию).:
EDIT: (?<=chr)
является положительным взглядом, он гарантирует, что \w
совпадение начнется только после того, как строка chr
произошла:
df %>%
extract(col = 'wide peak boundaries',
into = c('chr', 'start', 'end'),
regex = '((?<=chr)\w ):(\d )-(\d )',
remove = FALSE, convert = TRUE)
Group Direction cytoband q value residual q value wide peak boundaries chr start end
V29 All DEL 11q25 7.78E-43 2.22E-39 chr11:130906630-135086622 11 130906630 135086622
V30 All DEL Xp22.11 3.01E-38 1.91E-35 chrX:23277186-26139553 X 23277186 26139553
V31 All DEL 10q23.31 3.61E-31 3.61E-31 chr10:87745632-87859602 10 87745632 87859602
V32 All DEL 22q12.3 4.03E-25 3.96E-25 chr22:33050952-34766503 22 33050952 34766503
V33 All DEL 11p15.4 6.59E-25 6.59E-25 chr11:3230287-3799554 11 3230287 3799554