それでははじめます。 必要なパッケージの読み込みましょう
── 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
まずはインポートです。
kiroku <- readxl::read_excel("data/看護記録もどき.xlsx")
View(kiroku)
だいぶややこしいですが順番に考えていきます。
まず、「患者名」列をなんとかしましょう
# 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
最終的にどのような形にもっていきたいかでこの先の処理は変わります。次の動画では、この先の処理の一例をお示しします。