156  看護記録もどきの加工1

それでははじめます。 必要なパッケージの読み込みましょう

library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.2     ✔ readr     2.1.4
✔ forcats   1.0.0     ✔ stringr   1.5.0
✔ ggplot2   3.4.2     ✔ tibble    3.2.1
✔ lubridate 1.9.2     ✔ tidyr     1.3.0
✔ purrr     1.0.1     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readxl)

まずはインポートです。

kiroku <- readxl::read_excel("data/看護記録もどき.xlsx")

View(kiroku)

だいぶややこしいですが順番に考えていきます。

まず、「患者名」列をなんとかしましょう

kiroku %>% select(`患者名`)
# A tibble: 10 × 1
   患者名    
   <chr>     
 1 Aさん     
 2  血圧    
 3  脈拍    
 4  呼吸回数
 5  食事    
 6 Bさん     
 7  血圧    
 8  脈拍    
 9  呼吸回数
10  食事    

患者名の下に、それぞれの測定項目の名前が記載されているため、「患者名」の列をもとに、nameという列を作成して、そこに、患者名を埋めていくようにしてみましょう。

注目する列だけを抜き出して変化をみると、

kiroku %>% 
  select(`患者名`) %>% 
  mutate(name = 
           if_else(
             str_detect(`患者名`,"^\\s"), 
             NA_character_,
             `患者名`)) %>%
  fill(name)
# A tibble: 10 × 2
   患者名     name 
   <chr>      <chr>
 1 Aさん      Aさん
 2  血圧     Aさん
 3  脈拍     Aさん
 4  呼吸回数 Aさん
 5  食事     Aさん
 6 Bさん      Bさん
 7  血圧     Bさん
 8  脈拍     Bさん
 9  呼吸回数 Bさん
10  食事     Bさん

こんな感じで、Aさんの行なのかBさんのデータがある行なのか、name列を見ることで班別することができるようになりました。

kiroku2 <- kiroku %>% 
  mutate(name = 
           if_else(
             str_detect(`患者名`,"^\\s"), 
             NA_character_,
             `患者名`)) %>%
  fill(name)

kiroku2  
# A tibble: 10 × 6
   患者名     `4月1日`      `4月2日`      `4月3日`      `4月4日`       name 
   <chr>      <chr>         <chr>         <chr>         <chr>          <chr>
 1 Aさん      入院          <NA>          <NA>          退院           Aさん
 2  血圧        -128/88 130/78-120/72 128/82-140/76 130/68 -      Aさん
 3  脈拍     92 - 90     89 - 83     83 - 80     88 -          Aさん
 4  呼吸回数 16 - 20     12回-16回     20 - 16     16 -          Aさん
 5  食事      -10-8       8割-9割-10割  7割-8割-10割  10-            Aさん
 6 Bさん      <NA>          <NA>          入院          <NA>           Bさん
 7  血圧     <NA>          <NA>          100/60-98/58  106/54-90/50   Bさん
 8  脈拍     <NA>          <NA>          60 - 62     64 - 66      Bさん
 9  呼吸回数 <NA>          <NA>          20 - 16     16 - 20      Bさん
10  食事     <NA>          <NA>          -10割-10割    10割-10割-10割 Bさん

次に、「患者名」列からすでに患者名はとりだしたので、名前を、「測定項目」として、並び替えておきます

kiroku3 <- kiroku2 %>% 
  select(name, sokutei = `患者名`, everything())

selectでもrenameと同じ書き方できたの覚えていますか?また、everything()とすることで、残りの列も選択できるので変数名を変えながら並び替えることができます。

次に、sokutei列で、患者名が書いてある行は入退院に関するデータが含まれているので、その行をadmissionと書き換えます。

列だけ取り出して変換をみてみると、

kiroku3 %>% 
  select(sokutei) %>% 
  mutate(sokutei2 = 
           if_else(str_detect(sokutei,"^\\s"),
                   sokutei, "admission"))
# A tibble: 10 × 2
   sokutei    sokutei2  
   <chr>      <chr>     
 1 Aさん      admission 
 2  血圧      血圧    
 3  脈拍      脈拍    
 4  呼吸回数  呼吸回数
 5  食事      食事    
 6 Bさん      admission 
 7  血圧      血圧    
 8  脈拍      脈拍    
 9  呼吸回数  呼吸回数
10  食事      食事    

こんな感じで、sokutei列のスペースが先頭にあればもとのまま、なければadmissionに書き換えるという処理を行います。

kiroku4 <- kiroku3 %>% 
  mutate(sokutei = if_else(
    str_detect(sokutei,"^\\s"),
    sokutei, "admission"
  ))

kiroku4
# A tibble: 10 × 6
   name  sokutei    `4月1日`      `4月2日`      `4月3日`      `4月4日`      
   <chr> <chr>      <chr>         <chr>         <chr>         <chr>         
 1 Aさん admission  入院          <NA>          <NA>          退院          
 2 Aさん  血圧        -128/88 130/78-120/72 128/82-140/76 130/68 -     
 3 Aさん  脈拍     92 - 90     89 - 83     83 - 80     88 -         
 4 Aさん  呼吸回数 16 - 20     12回-16回     20 - 16     16 -         
 5 Aさん  食事      -10-8       8割-9割-10割  7割-8割-10割  10-           
 6 Bさん admission  <NA>          <NA>          入院          <NA>          
 7 Bさん  血圧     <NA>          <NA>          100/60-98/58  106/54-90/50  
 8 Bさん  脈拍     <NA>          <NA>          60 - 62     64 - 66     
 9 Bさん  呼吸回数 <NA>          <NA>          20 - 16     16 - 20     
10 Bさん  食事     <NA>          <NA>          -10割-10割    10割-10割-10割

これで各行に対してsokuteiコラムでラベルをつけることができたので、先頭の余分なスペースを削除してからタテのデータに変換します

temp <- kiroku4 %>% 
  select(sokutei) %>% 
  mutate(sokutei2 = str_trim(sokutei))

str_view_all(temp$sokutei,"\\s")
Warning: `str_view()` was deprecated in stringr 1.5.0.
ℹ Please use `str_view_all()` instead.
 [1] │ admission
 [2] │ <{\u3000}>血圧
 [3] │ <{\u3000}>脈拍
 [4] │ <{\u3000}>呼吸回数
 [5] │ <{\u3000}>食事
 [6] │ admission
 [7] │ <{\u3000}>血圧
 [8] │ <{\u3000}>脈拍
 [9] │ <{\u3000}>呼吸回数
[10] │ <{\u3000}>食事
str_view_all(temp$sokutei2,"\\s")
 [1] │ admission
 [2] │ 血圧
 [3] │ 脈拍
 [4] │ 呼吸回数
 [5] │ 食事
 [6] │ admission
 [7] │ 血圧
 [8] │ 脈拍
 [9] │ 呼吸回数
[10] │ 食事

スペース、消えていますね?

kiroku5 <- kiroku4 %>% 
  mutate(sokutei = str_trim(sokutei))

kiroku5
# A tibble: 10 × 6
   name  sokutei   `4月1日`      `4月2日`      `4月3日`      `4月4日`      
   <chr> <chr>     <chr>         <chr>         <chr>         <chr>         
 1 Aさん admission 入院          <NA>          <NA>          退院          
 2 Aさん 血圧         -128/88 130/78-120/72 128/82-140/76 130/68 -     
 3 Aさん 脈拍      92 - 90     89 - 83     83 - 80     88 -         
 4 Aさん 呼吸回数  16 - 20     12回-16回     20 - 16     16 -         
 5 Aさん 食事       -10-8       8割-9割-10割  7割-8割-10割  10-           
 6 Bさん admission <NA>          <NA>          入院          <NA>          
 7 Bさん 血圧      <NA>          <NA>          100/60-98/58  106/54-90/50  
 8 Bさん 脈拍      <NA>          <NA>          60 - 62     64 - 66     
 9 Bさん 呼吸回数  <NA>          <NA>          20 - 16     16 - 20     
10 Bさん 食事      <NA>          <NA>          -10割-10割    10割-10割-10割

ここまできたら、これは横持ちデータで、日付のデータが列名になってしまっている形なのでpivot_longerで縦持ちデータに直しましょう

kiroku6 <- kiroku5 %>% 
  pivot_longer(cols = !c(name,sokutei),
               names_to = "date",
               values_to = "val")

kiroku6
# A tibble: 40 × 4
   name  sokutei   date   val          
   <chr> <chr>     <chr>  <chr>        
 1 Aさん admission 4月1日 入院         
 2 Aさん admission 4月2日 <NA>         
 3 Aさん admission 4月3日 <NA>         
 4 Aさん admission 4月4日 退院         
 5 Aさん 血圧      4月1日    -128/88
 6 Aさん 血圧      4月2日 130/78-120/72
 7 Aさん 血圧      4月3日 128/82-140/76
 8 Aさん 血圧      4月4日 130/68 -    
 9 Aさん 脈拍      4月1日 92 - 90    
10 Aさん 脈拍      4月2日 89 - 83    
# ℹ 30 more rows

NAとなっている部分はデータが存在しないので消します。

kiroku7 <- kiroku6 %>%
  filter(!is.na(val))

kiroku7
# A tibble: 27 × 4
   name  sokutei   date   val          
   <chr> <chr>     <chr>  <chr>        
 1 Aさん admission 4月1日 入院         
 2 Aさん admission 4月4日 退院         
 3 Aさん 血圧      4月1日    -128/88
 4 Aさん 血圧      4月2日 130/78-120/72
 5 Aさん 血圧      4月3日 128/82-140/76
 6 Aさん 血圧      4月4日 130/68 -    
 7 Aさん 脈拍      4月1日 92 - 90    
 8 Aさん 脈拍      4月2日 89 - 83    
 9 Aさん 脈拍      4月3日 83 - 80    
10 Aさん 脈拍      4月4日 88 -        
# ℹ 17 more rows

最終的にどのような形にもっていきたいかでこの先の処理は変わります。次の動画では、この先の処理の一例をお示しします。