首页 > 解决方案 > 使用正则表达式从数据框中提取等位基因特定信息并将其拆分为两个新的数据框

问题描述

我有一个 100 x 100 的数据框,其中包含基因组中 100 个 SNP 的 100 个样本 ID,格式如下。

structure(list(`c("12545=1", "12545=0")` = c("12545=1|1", "12545=0|0"
), `c("12994=0|0", "12994=0|1")` = c("12994=0|0", "12994=0|1"
), `c("15240=0|0", "15240=1|1")` = c("15240=0|0", "15240=1|1"
)), row.names = c(NA, -2L), class = c("tbl_df", "tbl", "data.frame"
))

两侧的整数|代表每个个体的基因型。我正在寻找 bash 或 R 中的解决方案,可能使用正则表达式,它创建两个新的数据框,每个数据框的尺寸都与第一个相同。一个数据帧仅包含每个基因座的每个样本的参考等位基因信息,因此仅包含 之前的整数值,|而第二个数据帧包含每个基因座的备用等位基因信息,即|每个单元格中仅包含 之后的整数值。因此,将生成两个 1 和 0 的新 100 x 100 数据帧。

之前的一切都=可以忽略。

任何有关如何解决此问题的建议将不胜感激。

标签: rregexbashdataframesplit

解决方案


假设您的数据存储在 data framedf中,这应该可以满足您的要求:

library(tidyverse)

df1 <- df %>% 
  mutate_all(~ str_extract(., "\\d(?=\\|)"))

df2 <- df %>% 
  mutate_all(~ str_extract(., "(?<=\\|)\\d"))


df1

#   `c("12545=1", "12545=0")` `c("12994=0|0", "12994=0|1")` `c("15240=0|0", "15240=1|1")`
#   <chr>                     <chr>                         <chr>                        
# 1 1                         0                             0                            
# 2 0                         0                             1                            


df2

#   `c("12545=1", "12545=0")` `c("12994=0|0", "12994=0|1")` `c("15240=0|0", # "15240=1|1")`
#   <chr>                     <chr>                         <chr>                        
# 1 1                         0                             0                            
# 2 0                         1                             1         

请注意,您的示例中的列名有点奇怪,但它应该可以工作。


推荐阅读