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関数を利用して列を作成する方法について解説いたしました。
この二つをうまく組み合わせることで文字列を含む列の作成はかなり自由にできるようになるはずです