Извлеките аллель, определяющий c информацию из фрейма данных, используя регулярное выражение, и разделите его на два новых фрейма данных - PullRequest
1 голос
/ 29 апреля 2020

У меня есть кадр данных 100 на 100, который содержит 100 образцов идентификаторов для 100 SNP в геноме в следующем формате.

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, потенциально использующее регулярное выражение, которое создает два новых фрейма данных, каждый из которых имеет те же измерения, что и первый. Один кадр данных, содержащий только информацию об эталонном аллеле для каждого образца в каждом локусе, поэтому содержит только целочисленное значение перед |, а второй кадр данных, содержащий информацию о альтернативном аллеле в каждом локусе, т.е. только значение целого числа после | в каждой клетке. Таким образом, будут сгенерированы два новых кадра данных размером 100 x 100 с единицами и нулями.

Все, что находится до =, можно игнорировать.

Любой совет о том, как решить эту проблему, будет принят с благодарностью.

1 Ответ

2 голосов
/ 29 апреля 2020

Если ваши данные хранятся во фрейме данных df, это должно сделать то, что вы хотите:

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         

Обратите внимание, что имена столбцов в вашем примере немного странные, но, тем не менее, они должны работать .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...