119  実践 str_extract/str_replaceとmutate

library(tidyverse)

続いて、ここではmutateとstr_関数を組み合わせる方法を考えましょう。

vec <- c("ast:40IU/L","alt:30IU/L",
         "ggt:20IU/L","hba1c:4.3mg/dL",
         "glu:90mg/dL","BMI:23.0kg/m2",
         "eGFR:60mL/min/1.73m2")

prac <- tibble(target = vec)
prac
# A tibble: 7 × 1
  target              
  <chr>               
1 ast:40IU/L          
2 alt:30IU/L          
3 ggt:20IU/L          
4 hba1c:4.3mg/dL      
5 glu:90mg/dL         
6 BMI:23.0kg/m2       
7 eGFR:60mL/min/1.73m2

というデータがあって、正規表現を利用して、target列を、name列とvalue列にコロンを境にして取り出して新しい列を作成する場合を考えてみましょう。

これは、(スライド62)の処理を行う場合そのままです。

列を作るにはmutate関数を利用して、data %>% mutate(列名 = ベクトル)で、列が作れましたね?

str_extract関数を利用すれば、

str_extract(vec,"(?<=:)(\\d+\\.\\d+|\\d+)")
[1] "40"   "30"   "20"   "4.3"  "90"   "23.0" "60"  

このように、コロンの左側に続く(小数あるいは数字)を抽出することができました。

注:

str_extract(vec,"\\d+\\.\\d+|\\d+")
[1] "40"   "30"   "20"   "1"    "90"   "23.0" "60"  

だけだと、HbA1cの1が引っかかってしまうので、不適切です

後は、

str_extract(vec,"^.+(?=:)")
[1] "ast"   "alt"   "ggt"   "hba1c" "glu"   "BMI"   "eGFR" 

としてあげれば、先頭から、コロンまでのすべての文字列を取得することができるので検査名の出力が可能となります。

抜き出す正規表現がわかればこれを、mutateに与えてあげれば良いので、結局、

prac2 <- prac %>% 
  mutate(
    name = str_extract(target, "^.+(?=:)"),
    value = str_extract(target, "(?<=:)(\\d+\\.\\d+|\\d+)")
  ) 

prac2
# A tibble: 7 × 3
  target               name  value
  <chr>                <chr> <chr>
1 ast:40IU/L           ast   40   
2 alt:30IU/L           alt   30   
3 ggt:20IU/L           ggt   20   
4 hba1c:4.3mg/dL       hba1c 4.3  
5 glu:90mg/dL          glu   90   
6 BMI:23.0kg/m2        BMI   23.0 
7 eGFR:60mL/min/1.73m2 eGFR  60   

と分割することができました。

ついでに単位も抜き出してみましょうただ挑戦してみていただくとわかるのですが、ここまでの範囲ではうまく単位を抜き出すことができません

本コース、正規表現をマスターするのが目的ではないので、複数回加工して最終的に単位単独の形にもっていくことを目指しましょう。具体的には

prac2 %>% 
  mutate(
    right = str_extract(target,"(?<=:).+$"),
    tani = str_replace(right, "^(\\d+\\.\\d+|\\d+)","")
  )
# A tibble: 7 × 5
  target               name  value right           tani         
  <chr>                <chr> <chr> <chr>           <chr>        
1 ast:40IU/L           ast   40    40IU/L          IU/L         
2 alt:30IU/L           alt   30    30IU/L          IU/L         
3 ggt:20IU/L           ggt   20    20IU/L          IU/L         
4 hba1c:4.3mg/dL       hba1c 4.3   4.3mg/dL        mg/dL        
5 glu:90mg/dL          glu   90    90mg/dL         mg/dL        
6 BMI:23.0kg/m2        BMI   23.0  23.0kg/m2       kg/m2        
7 eGFR:60mL/min/1.73m2 eGFR  60    60mL/min/1.73m2 mL/min/1.73m2

こんな感じです。

まず、rightという列に、コロンの右側を抜き出してあげます

str_extract(vec,"(?<=:).+$")
[1] "40IU/L"          "30IU/L"          "20IU/L"          "4.3mg/dL"       
[5] "90mg/dL"         "23.0kg/m2"       "60mL/min/1.73m2"

そうすると、right列は(小数あるいは整数)(単位)という形になるので、str_replace関数で(小数あるいは整数)を”“(空白)で置き換えてあげることで単位だけが残るという仕組みです。

いかがでしょうか?

ここではstr_extract、str_replace関数を利用して列を作成する方法について解説いたしました。

この二つをうまく組み合わせることで文字列を含む列の作成はかなり自由にできるようになるはずです