2017-11-14 6 views
2

에 여러 변수에 벡터를 할당하는 방법이 다음과 같은 데이터 프레임 :dplyr의 mutate

library(tidyverse) 

dat <-structure(list(motif_name_binned = c("Ddit3::Cebpa/MA0019.1/Jaspar.instid_chr1:183286845-183287245.bin1", 
"Ddit3::Cebpa/MA0019.1/Jaspar.instid_chr1:183286845-183287245.bin2", 
"Ddit3::Cebpa/MA0019.1/Jaspar.instid_chr1:183286845-183287245.bin3" 
), motif_score = c(6.816695, 6.816695, 6.816695)), row.names = c(NA, 
-3L), class = c("tbl_df", "tbl", "data.frame"), .Names = c("motif_name_binned", 
"motif_score")) 

dat 

이 제공 :

> dat 
# A tibble: 3 x 2 
                motif_name_binned motif_score 
                   <chr>  <dbl> 
1 Ddit3::Cebpa/MA0019.1/Jaspar.instid_chr1:183286845-183287245.bin1 6.816695 
2 Ddit3::Cebpa/MA0019.1/Jaspar.instid_chr1:183286845-183287245.bin2 6.816695 
3 Ddit3::Cebpa/MA0019.1/Jaspar.instid_chr1:183286845-183287245.bin3 6.816695 

내가 motif_named_binned의 값을 추출하여 내가 원하는 것을 얻을 수 있습니다 이 코드를 사용하여 :

dat %>% 
    mutate(motif = str_match(motif_name_binned,"^(.*?)\\/.*?")[,2], 
     inst = str_match(motif_name_binned,"^.*?\\/.*?\\/.*?\\.instid_(.*?)\\.bin\\d+")[,2], 
     binno = as.integer(str_match(motif_name_binned,"^.*?\\/.*?\\/.*?\\.bin(\\d+)")[,2])) 

다음은

# A tibble: 3 x 5 
                motif_name_binned motif_score  motif      inst binno 
                   <chr>  <dbl>  <chr>     <chr> <int> 
1 Ddit3::Cebpa/MA0019.1/Jaspar.instid_chr1:183286845-183287245.bin1 6.816695 Ddit3::Cebpa chr1:183286845-183287245  1 
2 Ddit3::Cebpa/MA0019.1/Jaspar.instid_chr1:183286845-183287245.bin2 6.816695 Ddit3::Cebpa chr1:183286845-183287245  2 
3 Ddit3::Cebpa/MA0019.1/Jaspar.instid_chr1:183286845-183287245.bin3 6.816695 Ddit3::Cebpa chr1:183286845-183287245  3 

그러나 정규 표현식을 3 번 실행하고 하나씩 변수에 할당해야합니다. 어디 사실 나는 이와 같은 하나의 정규식을 사용할 수 있습니다 나중에 올인원 정규식 dplyr mutate()이 통합 방법

str_match(motif_name_binned,"^(.*?)\\/.*?\\/.*?\\.instid_(.*?)\\.bin(\\d+)")[,c(2,3,4)] 

?

답변

4

당신은 새로운 열로 정규 표현식에 캡처 그룹을 변환 할 tidyr::extract를 사용할 수 있습니다

library(tidyr) 
dat %>% 
    extract(motif_name_binned, c('motif', 'inst', 'binno'), regex = "^(.*?)\\/.*?\\/.*?\\.instid_(.*?)\\.bin(\\d+)", remove = FALSE) 

# A tibble: 3 x 5 
#             motif_name_binned  motif      inst binno motif_score 
#*                <chr>  <chr>     <chr> <chr>  <dbl> 
#1 Ddit3::Cebpa/MA0019.1/Jaspar.instid_chr1:183286845-183287245.bin1 Ddit3::Cebpa chr1:183286845-183287245  1 6.816695 
#2 Ddit3::Cebpa/MA0019.1/Jaspar.instid_chr1:183286845-183287245.bin2 Ddit3::Cebpa chr1:183286845-183287245  2 6.816695 
#3 Ddit3::Cebpa/MA0019.1/Jaspar.instid_chr1:183286845-183287245.bin3 Ddit3::Cebpa chr1:183286845-183287245  3 6.816695