R Markdown

ホームページに戻る

Rによる放射能測定のレポートに

前処理をどのように行うかが課題

(0) 血圧計のデータ形式

血圧計からのデータは時系列データであり、CSV形式のデータになっていました。
そのままでは朝に測定したものと夜測定したものが混在するため、 朝のデータと夜のデータを分けて取り扱うことができません。
主治医からの言葉では人により朝の血圧が高い人と夜の血圧が高いタイプの人がいる。
そのタイプの人にあった処置が必要になるとことでした。
そこで、朝と夜のデータを分けて扱うことを考えてみました。 エクセルではこれができたが、Rではまだできません。
なお、ここで示したデータは個人情報そのものです。 私の了解することなくこれらを使用しないでください。

準備

  1. Rをインストールする
  2. 統合環境のRStudioをインストールする
  3. レポート作成用エディタにRMarkdownのパッケージをインストールする
  4. packages(tidyverse)をインストールする
  5. 作業領域のフォルダを設定する(ketsuatsu_sokutei)
  6. 作業フォルダの中に次のサブフォルダを作る
    /figure
    /figure_asa
    /figure_yoru
    /ketsuatsu_asa_DATA
    /ketsuatsu_yoru_DATA
  7. 朝と夜の測定データをそれぞれのサブフォルダに入れる

血圧計からの測定データの取り入れ

始めにグローバル環境のデータや変数を削除しておきます。(Clear R’s brain)

血圧計の一か月分のデータを事前に朝と夜のデータから朝のデータと夜のデータに 分割したファイルにするための前処理

If you cannot get the letters you should reopen the file with encoding cp932 or shift JIS This file(ver. 5) can be opened with encoding uft 8

文字化けしたときには file -> Reopen with encoding …でエンコーディングを変換できる。


朝と夜の血圧データを読み込み、比較

編集 -> GUIプリファレンスのウインドウで文字の大きさを変更できる


朝と夜の血圧データを読み込み、比較

Clear R’s brain

rm(list = ls())
setwd("F:/R-3.6.2/R_renshu/ketsuatsu_sokutei")

次の方法でファイルをを読み込むこともできるが、再現性保たれないので望ましい方法ではない。 ketsuatsu_asa<-read.csv(file.choose()) fileを指定するダイアログが表示される。選んだ朝のデータをketsuatsu_asaに読み込む。

(1) 血圧計から取り込んだ朝のCSV形式のデータを取り込む

これから扱うファイル名とグラフの表題の表現を決める

  seireki="2024";
  tsuki="03";
  baajon=""
  library(tidyverse)# tidyverseのパッケージを使うことを宣言(プログラムのはじめには最初にこの行を書くこと)    
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
## ✔ ggplot2 3.4.0      ✔ purrr   1.0.0 
## ✔ tibble  3.1.8      ✔ dplyr   1.0.10
## ✔ tidyr   1.2.1      ✔ stringr 1.4.1 
## ✔ readr   2.1.3      ✔ forcats 0.5.2 
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
  library(lubridate)# lubridateのパッケージを使うことを宣言
##  要求されたパッケージ timechange をロード中です 
## 
##  次のパッケージを付け加えます: 'lubridate' 
## 
##  以下のオブジェクトは 'package:base' からマスクされています:
## 
##     date, intersect, setdiff, union
  ketsuatsu_asa <- read_csv(paste("./ketsuatsu_asa_DATA/ketsuatsu_asa_",seireki,"_",tsuki,".csv",sep=""))    
## Rows: 80 Columns: 5
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (1): hiduke
## dbl  (3): saikou, saitei, myakuhaku
## time (1): jikoku
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

バイナリーデータで保存してあれば、次のコードは朝のバイナリデータから取り出す方法である
load(paste(“./ketsuatsu_asa/ketsuatsu_asa_”,seireki,“_“,tsuki,baajon,”.R”,sep=““))

(2) 朝の各統計量を確認する

mean(ketsuatsu_asa$saikou);    
## [1] 132.0375
sd(ketsuatsu_asa$saikou);    
## [1] 5.992493
mean(ketsuatsu_asa$saitei);sd(ketsuatsu_asa$saitei);    
## [1] 74.1125
## [1] 3.926521
mean(ketsuatsu_asa$myakuhaku);sd(ketsuatsu_asa$myakuhaku)    
## [1] 59.3375
## [1] 2.823696
par(mfrow=c(1,2)) # 画面分割
png(paste("figure/asa/hist_asa_shuushukuki_",seireki,"_",tsuki,baajon,".png",sep=""),width = 400,height = 800)

  hist(ketsuatsu_asa$saikou,main=paste(seireki,"年",tsuki,"月朝の収縮期血圧の度数分布"),
    xlab="朝の収縮期血圧",ylab="度数",col="#ff000020")# col:red,透明度:H20
  text(125,15,labels=paste("朝収縮期血圧平均",round(mean(ketsuatsu_asa$saikou)),1),col="red",srt=0)
  text(125,10,labels=paste("標準偏差",round(sd(ketsuatsu_asa$saikou)),1),col="black",srt=0)
png(paste("figure/asa/hist_asa_kakuchouki_",seireki,"_",tsuki,baajon,".png",sep = ""),width = 400,height = 800)

  hist(ketsuatsu_asa$saitei,main=paste(seireki,"年",tsuki,"月朝の拡張期血圧の度数分布",baajon),xlab="朝の拡張期血圧",ylab="度数",
       col="#0000ff20") # col:blue,透明度H20
  text(70,14,labels=paste("朝拡張期血圧平均",round(mean(ketsuatsu_asa$saitei)),1),col="blue",srt=0);    
  text(70,10,labels=paste("標準偏差",round(sd(ketsuatsu_asa$saitei)),1),col="black",srt=0);
  dev.off()
## png 
##   2
  par(mfrow=c(1,1)) # 画面分割中止する    
  summary(ketsuatsu_asa)
##     hiduke             jikoku             saikou        saitei     
##  Length:80          Length:80         Min.   :123   Min.   :63.00  
##  Class :character   Class1:hms        1st Qu.:127   1st Qu.:72.00  
##  Mode  :character   Class2:difftime   Median :131   Median :74.00  
##                     Mode  :numeric    Mean   :132   Mean   :74.11  
##                                       3rd Qu.:136   3rd Qu.:76.00  
##                                       Max.   :146   Max.   :87.00  
##    myakuhaku    
##  Min.   :55.00  
##  1st Qu.:57.00  
##  Median :59.00  
##  Mean   :59.34  
##  3rd Qu.:60.25  
##  Max.   :71.00

(3) 選んだ夜のデータをketsuatsu_yoruに読み込む。

次の方法でバイナリーデータからデータを取り出すことができるが、
この方法では再現性損なうので、注意すること。
ketsuatsu_yoru<-read.csv(file.choose()) fileを指定するダイアログが表示される。

 夜のバイナリデータを保存する方法
save(ketsuatsu-yoru,paste(“./ketsuatsu_yoru/ketsuatsu_yoru_”,seireki,“ver.”,baajon,“.R”,sep=““))
 夜のバイナリデータから取り出す方法
load(paste(”./ketsuatsu_yoru/ketsuatsu_yoru_“,seireki,”_“,tsuki,”ver.”,baajon,“.R”,sep=““))

夜のCSV形式のデータから取り出す

  ketsuatsu_yoru<-read_csv(paste("./ketsuatsu_yoru_DATA/ketsuatsu_yoru_",seireki,"_",tsuki,baajon,".csv",sep=""))
## Rows: 87 Columns: 5
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (1): hiduke
## dbl  (3): saikou, saitei, myakuhaku
## time (1): jikoku
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

(4) 夜の各統計量を確認する

  mean(ketsuatsu_yoru$saikou);
## [1] 128.7701
  sd(ketsuatsu_yoru$saikou);
## [1] 11.1028
  mean(ketsuatsu_yoru$saitei);
## [1] 77.94253
  sd(ketsuatsu_yoru$saitei);
## [1] 6.260538
  mean(ketsuatsu_yoru$myakuhaku);
## [1] 75.06897
  sd(ketsuatsu_yoru$myakuhaku)
## [1] 7.718587
par(mfrow=c(1,2))   # 画面分割
  png(paste("figure/yoru/hist_yoru_shuushukuki_",seireki,"_",tsuki,baajon,".png",sep=""),
      width = 400,height = 800)
  hist(ketsuatsu_yoru$saikou,main=paste(seireki,"年",tsuki,"月夜の収縮期血圧の度数分布",baajon,sep=""),
       xlab="夜の収縮期血圧",ylab="度数",col="#ff000020");# col:red,透明度:H20
  text(127,10,labels=paste(seireki,"年",tsuki,"月夜の収縮期血圧平均",round(mean(ketsuatsu_yoru$saikou)),1),
       col="red",srt=0);
  text(127,8,labels=paste("標準偏差",round(sd(ketsuatsu_yoru$saikou)),1),col="black",srt=0);
  dev.off()
## png 
##   2
  png(paste("figure/yoru/hist_yoru_kakuchouki_",seireki,"_",tsuki,baajon,".png",sep=""),
      width = 400,height = 800)
  hist(ketsuatsu_yoru$saitei,main=paste(seireki,"年",tsuki,"月夜の拡張期血圧の度数分布",baajon,sep=""),
       xlab="夜の拡張期血圧",ylab="度数",col="#0000ff20");# col:blue,透明度:H20;
  text(77,12,labels=paste(seireki,"年",tsuki,"月夜の拡張期血圧平均",round(mean(ketsuatsu_yoru$saitei)),1),
  col="purple",srt=0);text(77,08,labels=paste("標準偏差",round(sd(ketsuatsu_yoru$saitei)),1),col="black",srt=0);
  dev.off()    
## png 
##   2
  summary(ketsuatsu_yoru)
##     hiduke             jikoku             saikou          saitei     
##  Length:87          Length:87         Min.   : 99.0   Min.   :64.00  
##  Class :character   Class1:hms        1st Qu.:122.5   1st Qu.:75.00  
##  Mode  :character   Class2:difftime   Median :131.0   Median :78.00  
##                     Mode  :numeric    Mean   :128.8   Mean   :77.94  
##                                       3rd Qu.:136.0   3rd Qu.:82.00  
##                                       Max.   :156.0   Max.   :94.00  
##    myakuhaku    
##  Min.   :59.00  
##  1st Qu.:70.00  
##  Median :75.00  
##  Mean   :75.07  
##  3rd Qu.:80.00  
##  Max.   :93.00

(5) これより朝と夜の血圧時系列データのグラフを作成する

  par(mfrow=c(1,1))

画面分割キャンセル

棒グラフに挑戦

png(paste(“figure/asa/hist_asa_kakuchouki_”,seireki,“_“,tsuki,baajon,”.png”,sep=““),width = 400,height = 800) barplot(ketsuatsu_asa\(saikou,ylab="収縮期血圧、拡張期血圧",xlim=c(1,80),ylim=c(60,160), main="2022年08月朝血圧変動",col="blue") par(new=T) barplot(ketsuatsu_asa\)saitei,ylab=”“,xlim=c(1,80),ylim=c(60,160), main=”2022年08月朝血圧変動”,col=“white”) dev.off()

表題のタイプとファイル名の表現

seireki="2024";tsuki="03";baajon=""
png(paste("figure/plot_asa_yoru_jikeiretsu_",seireki,"_",tsuki,baajon,".png",sep = ""),
    width = 1000,height = 600);
plot(ketsuatsu_asa$saikou,xlab="",ylab="収縮期血圧、拡張期血圧、脈拍",xlim=c(1,90),ylim=c(50,160),
    main=paste(seireki,"年",tsuki,"月朝と夜の比較",baajon,sep=""),type="o",lty=1,lwd=2,col='red',pch=16)
# 朝の血圧の最高値をプロット
  par(new=T);plot(ketsuatsu_yoru$saikou,xlab="",ylab="",xlim=c(1,90),ylim=c(50,160),main="",
    type="o",lty=1,lwd=2,col='darkgreen',pch=16);# 画面に重ねて夜の血圧の最高値をプロット;
  abline(h=c(85,135));abline(h=c(60,70,80,90,100,110,120,130,140,150,160),lty=2);
  abline(v=c(15,60,45,60,75,90),lty="dashed");par(new=T);
  # 画面に重ねて朝の血圧の最低値をプロット
  plot(ketsuatsu_asa$saitei,xlab="",ylab="",xlim=c(1,90),ylim=c(50,160),type="o",lty=1,lwd=2,
    col='red',pch=18);par(new=T)# 画面に重ねて夜の血圧の最低値をプロット    
  plot(ketsuatsu_yoru$saitei,xlab="",ylab="",xlim=c(1,90),ylim=c(50,160),type="o",lty=1,lwd=2,
    col='darkgreen',pch=18);par(new=T);# 画面に重ねて朝の脈拍を表示
  plot(ketsuatsu_asa$myakuhaku,xlab="",ylab="",xlim=c(1,90),ylim=c(50,160),type="o",col='orange',
       lty=1,lwd=2,pch=24);par(new=T)# 画面に重ねて夜の脈拍を表示    
  plot(ketsuatsu_yoru$myakuhaku,xlab="",ylab="",xlim=c(1,90),ylim=c(50,160),type="o",col='blue', lty=1,lwd=2,      pch=25);par(new=T);# 朝の収縮期血圧、拡張期血圧の平均および標準偏差をテキストボックスで記入;
  text(5,105,labels=paste("朝収縮期血圧",round(mean(ketsuatsu_asa$saikou)),1),col="red",srt=0);text(5,100,
    labels=paste("標準 偏差",round(sd(ketsuatsu_asa$saikou)),2),col="black",srt=0);
  text(5,95,labels=paste("朝拡張期血圧",round(mean(ketsuatsu_asa$saitei)),1),col="red",srt=0);
  text(5,90,labels=paste("標準偏差",round(sd(ketsuatsu_asa$saitei)),2),col="black",srt=0);
  # 夜の収縮期血圧、拡張期血圧の平均および標準偏差をテキストボックスで記入
  text(20,105,labels=paste("夜収縮期血圧",round(mean(ketsuatsu_yoru$saikou)),1),col="darkgreen",srt=0);
  text(20,100,labels=paste("標準偏差",round(sd(ketsuatsu_yoru$saikou)),2),col="black",srt=0);
  text(20,95,labels=paste("夜拡張期血圧",round(mean(ketsuatsu_yoru$saitei)),1),col="darkgreen",srt=0);
  text(20,90,labels=paste("標準偏差",round(sd(ketsuatsu_yoru$saitei)),2),col="black",srt=0);
  # 凡例
  names_asa<-paste("朝 : ",c("収縮期血圧","拡張期血圧","脈拍数"))
  legend(35,110,names_asa,col=c('red','red','orange'),pch=c(16,18,24),lwd=2,merge=1,bg= 0)
  names_yoru<-paste("夜 : ",c("収縮期血圧","拡張期血圧","脈拍数"))
  legend(60,110,names_yoru,col=c('darkgreen','darkgreen','blue'),pch=c(16,18,25),lwd=2,merge=1,bg= 0)

  dev.off()
## png 
##   3

(6) 朝と夜の収縮期血圧 対 拡張期血圧の表示

png(paste("figure/plot_asa_yoru_hikaku_",seireki,"_",tsuki,baajon,".png",sep=""),width = 1000,height = 600)

par(mfrow=c(1,2)) # 画面分割

a 1枚目のグラフを描く

正常血圧のときには◆で表示  収縮期血圧135以上×表示 拡張期血圧85以上×表示とする

  plot(ketsuatsu_asa$saitei,ketsuatsu_asa$saikou,xlim=c(50,90),ylim=c(100,160),main=paste(seireki,"年"
    ,tsuki,"月朝の血圧",baajon,sep=""),xlab="拡張期血圧(最低値)",ylab="収縮期血圧(最高値)",type="o",
    lty=3,lwd=1,col=ifelse(ketsuatsu_asa$saikou>135 |  ketsuatsu_asa$saitei>85,"red","black"),pch=ifelse(ketsuatsu_asa$saikou> 135 | ketsuatsu_asa$saitei> 85,4,18));
  abline(h=c(100,105,110,115,120,125,130,140,145,150,155,160),col="black",lty="dashed");
  abline(v=c(50.55,60,65,70,75,80,85,90),col="black",lty="dashed");
  abline(h=135,col="red",lty="solid");
  abline(v=85,col="red",lty="solid");
  # 線種や色を指示しないときにはデフォルト設定となることが分かりました。
  # 色も数字で指定するよりも"red"や"black"などと見てすぐにわかる表現の方か好ましい。

  par(new=T);# 画面に重ねて表示    
  plot(mean(ketsuatsu_asa$saitei),mean(ketsuatsu_asa$saikou),xlim=c(50,90),ylim=c(100,160), main="",xlab="",ylab="",type="p",col="darkgreen",pch=16,font=(20));par(new=T);# 画面に重ねて表示
  X1<- mean(ketsuatsu_asa$saitei);
  Y1=mean(ketsuatsu_asa$saikou);
  hensa_X1<- sd(ketsuatsu_asa$saitei);
  hensa_Y1<- sd(ketsuatsu_asa$saikou);
  arrows(X1-(hensa_X1),Y1,(X1+hensa_X1),Y1,lwd=2,col="blue",length=0.04,angle=90,code=3);
# 拡張期血圧の平均から標準偏差の範囲で線分を引く
  arrows(X1,(Y1-hensa_Y1),X1,(Y1+hensa_Y1),lwd=2,col="blue",length=0.04,angle=90,code=3);
# 収縮期血圧の平均から標準偏差の範囲    

  abline(h=mean(ketsuatsu_asa$saikou),col="blue");    
  abline(v=mean(ketsuatsu_asa$saitei),col="blue");par(new=T) # 画面に重ねて表示

#  type"p":点と線のプロット lty=1:線分の形式を実線にする lty=3 : ドット
#  col:色を指定する"black","red",1,2,3 \# pch=4 ◆ : pch= : pch=18 :?
#  locator(2)
#  朝の収縮期血圧、拡張期血圧の平均および標準偏差をテキストボックスで記入

text(80,120,labels=paste("朝収縮期血圧",round(mean(ketsuatsu_asa$saikou)),1),col="red",srt=0);
text(80,117,labels=paste("標準偏差",round(sd(ketsuatsu_asa$saikou)),2),col="black",srt=0);
text(80,114,labels=paste("朝拡張期血圧",round(mean(ketsuatsu_asa$saitei)),1),col="red",srt=0);
text(80,111,labels=paste("標準偏差",round(sd(ketsuatsu_asa$saitei)),2),col="black",srt=0)

b 二枚目のグラフを表示

  plot(ketsuatsu_yoru$saitei,ketsuatsu_yoru$saikou,xlim=c(50,90),ylim=c(100,160),main=paste(seireki,"年",
     tsuki,"月夜の血圧",baajon,sep=""),xlab="拡張期血圧(最低値)",ylab="収縮期血圧(最高値)",
     type="o",lty=3,lwd=1,col=ifelse(ketsuatsu_yoru$saikou>135 | ketsuatsu_yoru$saitei>85,"red","black"),pch=ifelse(ketsuatsu_yoru$saikou > 135 | ketsuatsu_yoru$saitei>85,4,18));
  
  abline(h=c(100,105,110,115,120,125,130,140,145,150,155,160),col="black",lty="dashed");
  abline(v=c(50,55,60,65,70,75,80,85,90),col="black",lty="dashed");
  abline(h=135,col="red",lty="solid");abline(v=85,col="red",lty="solid");

  par(new=T) # 画面に重ねて表示
  plot(mean(ketsuatsu_yoru$saitei),mean(ketsuatsu_yoru$saikou),xlim=c(50,90),ylim=c(100,160),main="",xlab="",   ylab="",type="p",col="darkgreen",pch=16,font=(20));par(new=T);# 画面に重ねて表示
  
  abline(h=mean(ketsuatsu_yoru$saikou),col="blue");    
  abline(v=mean(ketsuatsu_yoru$saitei),col="blue");par(new=T) # 画面に重ねて表示

X2<- mean(ketsuatsu_yoru$saitei);    
Y2<-mean(ketsuatsu_yoru$saikou);    
hensa_X2<- sd(ketsuatsu_yoru$saitei);    
hensa_Y2<- sd(ketsuatsu_yoru$saikou);    
arrows(X2-(hensa_X2),Y2,(X2+hensa_X2),Y2,lwd=2,col="blue",length=0.04,angle=90,code=3)
# 拡張期血圧の平均から標準偏差の範囲

par(new=T) # 画面に重ねて表示

arrows(X2,(Y2-hensa_Y2),X2,(Y2+hensa_Y2),lwd=2,col="blue",length=0.04,angle=90,code=3)
# 収縮期血圧の平均から標準偏差の範囲

# 夜の収縮期血圧、拡張期血圧の平均および標準偏差をテキストボックスで記入

  text(80,120,labels=paste("夜収縮期血圧",round(mean(ketsuatsu_yoru$saikou)),1),col="darkgreen",srt=0);
  text(80,117,labels=paste("標準偏差",round(sd(ketsuatsu_yoru$saikou)),2),col="black",srt=0);
  text(80,114,labels=paste("夜拡張期血圧",round(mean(ketsuatsu_yoru$saitei)),1),col="darkgreen",srt=0);
  text(80,111,labels=paste("標準偏差",round(sd(ketsuatsu_yoru$saitei)),2),col="black",srt=0);par(new=T)
# 凡例のボックス表示

names<-paste("血圧 : ",c("正常血圧","高血圧"));legend(85,110,names,col=c("black","red"),pch=c(18,4),bg="white");

dev.off()
## png 
##   3
par(mfrow=c(1,1))

画面分割中止する

課題

前処理をどのように効率的に行うか
血圧計からのデータには朝のデータが混在しているし、測定できていない日の扱いもよく分かりません。
朝と夜のデータを分けて扱うことをまずはエクセルで考えてみました。 エクセルではこれができたが、Rではまだできません。 今は在職中に取った超能力アンケートの集計及び解析にもRで挑戦中です。
ここではデータをtidy DATAの形にできたところです。
Rにデータを読み込むことができました。
packages(tidyverse)を取り込むことに成功しました。(2022/12/26)
このデータ解析にご協力いただける方がいればご連絡してください。
Rに必要な部分だけ選択して取り込むことができるようになりました。 列名を指定できるようになりました。 tidayDataをお渡しできます。解析方法を伝授願います。

血圧測定のレポート終わり

Rによる放射能測定のレポートに

ホームページに戻る