有問題的字串示例稱為gene_snps:
"ultra_rare_variant_chr9:23143143_A/C_chr9:5322432_G/T_chr9:9840984342_T/C;chr9:5324234:G/T;chr9:324424_T/A"
期望的結果:
markerID
chr9:23143143_A/C
chr9:5322432_G/T
chr9:9840984342_T/C
chr9:5324234:G/T
chr9:324424_T/A
最終結果是一張表格:
CHR POS REF ALT
chr9 23143143 A C
chr9 5322432 G T
chr9 9840984342 T C
chr9 5324234 G T
chr9 324424 T A
當它們只是“;”時,我曾經有一個代碼將它們分開 分開使用:
x <- separate_rows(gene_snps, markerIDs, sep=c(";"))
x <- separate_rows(x, col="markerIDs", into=c("pos", "ref_alt"), sep=c("_"))
x <- separate_rows(x, col="pos", into=c("CHR", "POS"), sep=c(":"))
x <- separate_rows(x, col="ref_alt", into=c("REF", "ALT"), sep=c("/"))
但這現在已經過時了,因為用于生成代碼的上游工具現在引入了“ultra_rare”標簽,該標簽全部用“_”分隔。
任何有關拆分此字串以擺脫 ultra_rare_variant 位并將每個 chrx:x_x/x 塊拆分為自己的行的幫助將不勝感激!
一切順利
uj5u.com熱心網友回復:
我們只需要使用帶有前瞻的正則運算式:
library(stringr)
x = str_split(str, '[_;](?=chr)', simplify = T)[-1]
x
[1] "chr9:23143143_A/C" "chr9:5322432_G/T" "chr9:9840984342_T/C" "chr9:5324234:G/T"
[5] "chr9:324424_T/A"
這匹配“_”或“;” 立即進行“chr”,然后使用它來拆分字串。該引數simplify=T使其將結果作為向量而不是串列給出,我們使用[-1]洗掉第一個元素,即“ultra_rare_variant”
為了使它成為一個表,我們可以在“:”、“/”或“_”上再次拆分它并轉換為資料框。由于有多個字串和多個分割點,引數simplify=T給我們一個矩陣(每一行是一個字串x,每一列是分割后的一塊),可以轉換成一個data.frame:
tbl <- as.data.frame(str_split(x, '[:_/]', simplify = TRUE))
colnames(tbl) <- c('CHR', 'POS', 'REF','ALT') # Set column names
tbl
CHR POS REF ALT
1 chr9 23143143 A C
2 chr9 5322432 G T
3 chr9 9840984342 T C
4 chr9 5324234 G T
5 chr9 324424 T A
uj5u.com熱心網友回復:
用于stringr::str_match_all將所有內容直接保存到命名的捕獲組中。
x <- "ultra_rare_variant_chr9:23143143_A/C_chr9:5322432_G/T_chr9:9840984342_T/C;chr9:5324234:G/T;chr9:324424_T/A"
pattern <- "(?<CHR>chr\\d)?[_:/](?<POS>\\d )?[_:/](?<REF>[A-Z])?[_:/](?<ALT>[A-Z])?"
as.data.frame(stringr::str_match_all(x, pattern)[[1L]][, -1L])
輸出
CHR POS REF ALT
1 chr9 23143143 A C
2 chr9 5322432 G T
3 chr9 9840984342 T C
4 chr9 5324234 G T
5 chr9 324424 T A
uj5u.com熱心網友回復:
另一種可能的解決方案:
library(tidyverse)
s <- "ultra_rare_variant_chr9:23143143_A/C_chr9:5322432_G/T_chr9:9840984342_T/C;chr9:5324234:G/T;chr9:324424_T/A"
data.frame(CHR = s %>% str_remove("ultra_rare_variant_")) %>%
separate_rows(CHR, sep=";|_(?=chr9)") %>%
separate(CHR, into = c("CHR","POS","REF","ALT"), sep=":|_|/")
#> # A tibble: 5 × 4
#> CHR POS REF ALT
#> <chr> <chr> <chr> <chr>
#> 1 chr9 23143143 A C
#> 2 chr9 5322432 G T
#> 3 chr9 9840984342 T C
#> 4 chr9 5324234 G T
#> 5 chr9 324424 T A
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/418880.html
標籤:
上一篇:將字串截斷至n個字符,忽略空格
下一篇:Pandas資料框行不會丟失
