R言語による電子カルテデータの二次利用

~R言語初心者がデータ処理を楽しめるように基本的内容中心のサイトです~

Shinyアプリのテンプレートを簡単に作成してみる。

shinyアプリが盛り上がっています。僕の周りだけかもしれませんが…

R言語で便利な関数を作って、Rstudioで使用するのも良いのですが、時にはマウスで操作できるアプリを作りたくなる時もあります。そんな時Rには、shinyパッケージという簡単なアプリを作るパッケージが有ります。

ただアプリを作り始めて意外と面倒だと感じるのが、このshinyアプリの雛形づくりです。カッコの数があわなかったり、カンマが多かったり。アプリを作ると何度もエラーを吐かれます。(練習不足という話もありますが…)

そこで、簡単にshinyアプリのテンプレートを作成する、アプリを作成してみました。もちろんshinyアプリで…

ダウンロード

ここからzipファイルをダウンロードして使用してください。
GitHub - Algo1970/shinymaker

f:id:r_beginner:20170706203548p:plain

使用法

ダウンロード後、Rstudioからshinymakerフォルダのshinymakerプロジェクトを開いて下さい。 次にshinymaker.Rを実行します。shinymaker.R自体がshinyアプリですので、Run Appボタンを押して実行して下さい。


あくまでも個人使用のために作成したので、自分でよく使うUIやOutputコンテンツしか入れてありません。
雛形のテキストコードを貼り付けて、ui.Rとserver.Rのコードを自動作成するだけです。ですが…結構便利です。

起動後の画面は、こんな感じです。
f:id:r_beginner:20170706201111p:plain

画面を見ながら、タイトルつけたり、テーマを選択したり、入れたいパッケージをクリックしたり、UIコンテンツやoutoputコンテンツを選んだりして、最後にmake shinycodeボタンを押します。

これでワーキングディレクトリにshinyアプリ(ui.r/server.r)の入ったsampleフォルダが作成されます。
f:id:r_beginner:20170706202323p:plain
フォルダの中を覗くとui.Rとserver.Rができています。
f:id:r_beginner:20170706202412p:plain

どのようなコードが作成されたか確認するには、display codeボタンを押します。タブ内にコードが表示されました。
f:id:r_beginner:20170706202623p:plain

できたアプリを実行してみましょう。
f:id:r_beginner:20170706202911p:plain

ここまであっという間です。あとは、配置を変えたり、メインのコードを書くだけなので、気軽にshinyアプリが作れるようになりました。たくさん楽しいshinyアプリを作って、shinyサーバーに載せて楽しみましょう。

RでSQLserver(on Ubuntu16.04)への接続

現在当院で使用している電子カルテのデータベースは、MicrosoftSQLサーバーです。ハードの保守期間も過ぎたため、今回ハードの更新と、Windows10版のクライアントへの変更、サーバーも変更しました。
今までは、クライアントPC(windows7)にR・RstudioをインストールしSQLサーバーへの接続していましたが、他のクライアントPCからも同じ環境を使用できるようにRstudio serverで環境を作り直すことにします。

まず、ローカルネットワーク上にUbuntu実マシンを用意し、R環境とRstudio serverをインストール。いままでは、Windowsマシンからしか接続した経験がないので、UbuntuでのODBC接続の練習をしてみたいと思います。
自宅にSQLserverがないので、SQLserver2017 CTP2.1をubuntu16.04にインストールしてみます。CTPはCommunity Technology Previewで評価版のため使用制限もあります。なおこの評価版はUbuntu16.04、Ubuntu16.10で64bitが対応しているそうです。

kledgeb.blogspot.jp

SQLserverのインストー

練習環境ですのでUbuntu16.04の仮想マシンに構築します。
Ubuntu端末から下記シェルスクリプトを実行してください。

#!bin/sh

# install R
sudo sh -c "echo 'deb http://cran.ism.ac.jp/bin/linux/ubuntu xenial/' >> /etc/apt/sources.list"
gpg --keyserver keyserver.ubuntu.com --recv-key E084DAB9
gpg -a --export E084DAB9 | sudo apt-key add -
sudo apt-get update
sudo apt-get -y install r-base

# install Rstudio-server
sudo apt-get install gdebi-core
wget https://download2.rstudio.org/rstudio-server-1.0.143-amd64.deb
sudo gdebi rstudio-server-1.0.143-amd64.deb

# install RODBC
sudo apt-get install r-cran-rodbc

# install SQLserver
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
curl https://packages.microsoft.com/config/ubuntu/16.04/mssql-server.list | sudo tee /etc/apt/sources.list.d/mssql-server.list
sudo apt-get update
sudo apt-get install -y mssql-server
sudo /opt/mssql/bin/mssql-conf setup
# passwordを確認されるので、入力。

# install tools on Ubuntu
# curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - 
curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list
sudo apt-get update 
sudo apt-get -y install mssql-tools unixodbc-dev

echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc

途中でパスワード入力後に、評価版のため153日の試用期間と表示されますが、テスト環境なので十分です。
f:id:r_beginner:20170611132312j:plain


Linuxクライアントからの接続

まずは先程インストールした、mssql-toolsを使って接続します。
sqlcmdコマンドが使えるようになっているので、

$ sqlcmd -S localhost -U SA -P '<YourPassword>'
$ sqlcmd -S <IP address> -U SA -P '<YourPassword>'

接続できたでしょうか

$ sqlcmd -S localhost -U SA -P '********'
1> 

このように出力されればOKです。

1> SELECT Name from sys.Databases;
2> GO
Name                                                                                                                            
--------------------------------------------------------------------------------------------------------------------------------
master                                                                                                                          
tempdb                                                                                                                          
model                                                                                                                           
msdb                                                                                                                            
testdb                                                                                                                          

(5 rows affected)
1> 

SELECT文でデータベース名が確認できたかと思います。

次にODBC接続の練習です。

$ sudo gedit /etc/odbcinst.ini

でODBCdriverを確認してみましょう。
f:id:r_beginner:20170611134506j:plain

次にODBC.iniの設定です。

$ sudo gedit /etc/odbc.ini

f:id:r_beginner:20170611134828j:plain
上記を参考に、ポート番号、ユーザー名、パスワード、データベース名等入力してください。 [ ] の中(今回はsqlserver)がDSN(Data Source Name)です。

準備ができいたら、ブラウザから IPaddress : 8787 でRstudio serverにログインします。
PackageタブのあるPaneでRODBCがインストールされているのも、一応確認してみてください。

あとは新規ファイルを作成し、下記コードをコピペします。

library(RODBC)
con <- RODBC::odbcConnect(dsn="sqlserver",uid="SA",pwd="********")
sqlQuery(con, "select name from sys.Databases;")

実行すると、コンソールにデータベース名が出力されます。

> sqlQuery(con, "select name from sys.Databases;")
    name
1 master
2 tempdb
3  model
4   msdb
5 testdb
> 
Windowsクライアントからの接続

まず、Windows PowerShellを使います。
f:id:r_beginner:20170611141213j:plain
OSの左下、検索窓に 'pow'と入力してみてください。
シェルが立ち上がったら、先程同様に

$ sqlcmd -S <IP address> -U SA -P '<YourPassword>'
1> SELECT Name from sys.Databases;
2> GO

とコマンド入力してみてください。
f:id:r_beginner:20170611142750j:plain
データベース名が出力されます。

次にODBCドライバーを使います。

f:id:r_beginner:20170611141213j:plain
OSの左下、検索窓に 'データ'と入力してみてください。

f:id:r_beginner:20170611141604j:plain
検索候補に現れた、ODBCデータソースを選択

f:id:r_beginner:20170611141724j:plain
追加ボタンを押して、
f:id:r_beginner:20170611141752j:plain
データソース名、サーバーのIPアドレスを入力
f:id:r_beginner:20170611141852j:plain
SQLサーバー認証のため、ログインID、パスワードを入力し、次へ。
f:id:r_beginner:20170611141957j:plain
test data sourceボタンを押すと、
f:id:r_beginner:20170611142032j:plain
テスト成功の文字が出て終了です。

これでRstudio-serverを使えば、全ての職場PCから電子カルテサーバーにRでアクセスできるはず…。


参考

shiny server環境構築(ubuntu16.04)

職場のみんなでshinyアプリが使えるようにshiny server環境を構築してみたいと思います。

www.rstudio.com

今回も練習用にUbuntu仮想マシンを用意しました。

まずR、shiny、shiny-server等インストールしましょう。

$ sudo apt-get -y install r-base
$ sudo su - \
-c "R -e \"install.packages('shiny', repos='https://cran.rstudio.com/')\""
$ sudo apt-get install gdebi-core
$ wget https://download3.rstudio.org/ubuntu-12.04/x86_64/shiny-server-1.5.3.838-amd64.deb
$ sudo gdebi shiny-server-1.5.3.838-amd64.deb

これでインストールは終了です。
ブラウザにlocalhost:3838と入力してみましょう。
f:id:r_beginner:20170427203415j:plain
こんな画面がでれば上手くいっていると思います。

rmarkdown packageもインストールしておきましょう。

$ sudo su - -c "R -e \"install.packages('rmarkdown', repos='http://cran.rstudio.com/')\""

ブラウザにhttp://localhost:3838/sample-apps/rmd/と入力すると、
f:id:r_beginner:20170427205401j:plain
上手く見えたでしょうか。

今度は自作shinyアプリを、動かしてみましょう。
f:id:r_beginner:20170427221723j:plain
/srv/shiny-server/sample-apps以下に自作ファイルを起きます。hello,rmdフォルダはサンプルで、もともとあるものです。
ここにsample0427フォルダを作成します。

ユーザーをrootグループに入れておきます。

$ sudo gpasswd -a <username> root

あとは作成したshinyファイルを入れるだけです。

$ mkdir sample0427
$ gedit ui.R
$ gedit server.R

でshinyファイルを作成しました。
ブラウザでlocalhost:3838/sample-apps/sample0427と入力してみましたが、エラーで動いていないようです。

$ sudo systemctl status shiny-server
$ sudo systemctl restart shiny-server

serverは動いているようですし、再起動してみましたが、うまくブラウザから見えない…

$ sudo chmod 777 ui.R
$ sudo chmod 777 server.R
$ sudo systemctl restart shiny-server

権限与えてみましたが、ダメ

パッケージが入っていない?ggplot2 packageを入れてみましょう。

$ sudo su - -c "R -e \"install.packages('ggplot2', repos='http://cran.rstudio.com/')\""

f:id:r_beginner:20170427213211j:plain

今度は上手く表示されました。パッケージが入っていないだけだったのですが、気づくのに少し時間がかかりました。とりあえずこれで自作アプリがshiny-serverで動く環境ができました。あとは時間のある時に、設定ファイルの勉強をしておけば良いかな。


参考

OpenDolphin(オープンソース電子カルテ)とRstudioの接続

r-beginner.hatenadiary.jp

以前ブログで、OpenDolphin(電子カルテ)とORCA(日医レセコン)の環境構築について書いたところ、OpenDolphinデータベースを二次利用できるのかコメントをいただきました。

実際OpenDolphinで電子カルテを運用されている方の参考にもなるかもしれないので、仮想マシンでの環境構築とRstudioでの接続までを書いておきます。

いつも通りUbuntu仮想マシン(Ubuntu1404)を用意します。

インストール用のスクリプトは上記ブログ内のものとほぼ同じですが、OpenDolphinのDockerコンテナで使用しているPostgreSQLと、ORCAPostgreSQLのポートがぶつからないように、Docker runするときにPort(5433)を指定しています(通常は5432)。RstudioもクライアントPCにインストールするのが面倒なので、Dockerコンテナで入れちゃいます。

Ubuntuは固定IPに変更しておいた方がベターです。
端末から(Ctrl+Alt+T)。ファイル名は何でもよいですが、とりあえずdorca.shでシェルスクリプト用ファイルを作成します。

$ gedit dorca.sh

エディターが開いたら、下記スクリプトをコピペして、保存してください。

#!bin/sh
printf "password: "
read password

# install ORCA
echo "$password" | sudo -S wget -q https://ftp.orca.med.or.jp/pub/ubuntu/archive.key
sudo apt-key add archive.key
sudo wget -q -O \
/etc/apt/sources.list.d/jma-receipt-trusty48.list \
https://ftp.orca.med.or.jp/pub/ubuntu/jma-receipt-trusty48.list
sudo apt-get update
sudo apt-get -y dist-upgrade
echo "$password" | sudo -S apt-get install -y jma-receipt
wget https://ftp.orca.med.or.jp/pub/data/receipt/outline/update/claim_update.tar.gz
tar xvzf claim_update.tar.gz
sudo bash claim_update.sh
sudo jma-setup
sudo service jma-receipt start
sudo apt-get install -y panda-client2

# install OpenDolphin
sudo apt-get update
sudo apt-get install curl
sudo curl -sSL https://get.docker.com/|sh
sudo service docker start
sudo docker pull dolphindev/postgres
sudo docker pull dolphindev/wildfly

sudo docker run --name dolphin-db -p 5433:5432 -d dolphindev/postgres
sudo docker run --name dolphin-server --link dolphin-db:ds -p 8080:8080 -d dolphindev/wildfly
sudo docker run -d --name=rstudio -p 8787:8787  rocker/hadleyverse 

sudo service jma-receipt stop
sudo gedit /etc/postgresql/9.3/main/postgresql.conf
sudo gedit /etc/postgresql/9.3/main/pg_hba.conf 
sudo service postgresql stop 
sudo service postgresql start
sudo dpkg-reconfigure jma-receipt 
sudo service jma-receipt start
sudo ufw disable

# ORCApasswordの設定
sudo -u orca /usr/lib/jma-receipt/bin/passwd_store.sh

あとは、シェルスクリプトを実行するだけです。

$ sh dorca.sh

うちの通信環境とPCスペックだと、シェルスクリプトの実行時間は35分程度です。
途中ORCAの設定等の入力を求められますが、上記サイトに書いてある通り入力してください。

では今回のポイントのOpenDolphinとRstudioの接続です。
Rstudio serverはDockerコンテナで動いているので、仮想マシン(Ubuntu)のIPアドレスとポートをクライアントPCのブラウザーに入力します。
例)192.168.244.211:8787

f:id:r_beginner:20170303182547p:plain

UsernameとPasswordは共にrstudioです。
これでRstudio severに接続できます。
次にRstudioで新規ファイルを作成。

下記コードをコピペして、一行ずつ実行してみてください。

install.packages("RPostgreSQL")
library("RPostgreSQL")
library("dplyr")

con <- dbConnect(dbDriver("PostgreSQL"), 
                 host="192.168.244.211",  # 自分の環境のIPアドレスを入力
                 port="5433",
                 user= "postgres", 
                 dbname="dolphin",
                 password="postgres")
dbGetInfo(con)
dbListTables(con)
dbListFields(con, "d_stamp")
dbReadTable(con, "d_facility")
res <- dbSendQuery(con, "select * from demo_patient;") 
dbFetch(res) 
dbDisconnect(con)

dbConnectで接続オブジェクトを作って、dbListTablesでテーブルを確認したり

f:id:r_beginner:20170303203529j:plain

dbListFieldsでカラムを見たり

f:id:r_beginner:20170303203625j:plain

dbReadTableでテーブルを読み込んだり

f:id:r_beginner:20170303203700j:plain

ORCAから患者登録をして、OpenDolphinでカルテに書き込んで、Rstudioで実際にデータベースを確認してみると、いろいろアイデアが浮かんでくるかと思います。
楽しんでみてください。



参考サイト

DICOMserver構築②~Conquest・postgreSQL on Ubuntu16.04

以前DockerImageを使って、簡単なDICOMserver構築をブログにアップしましたが、今回は一つ一つコマンド入力しながらインストールして、データベースもPostgreSQLに変更してみます。

今回も仮想マシン(Ubuntu64bit 16.04LTS)上にサーバー構築します。
画像サーバーなので固定IPにしておきましょう。

基本は、下記サイトのインストール用ZIPファイル内にあるlinuxmanual.pdfに従って操作すれば問題ありません。
Conquest DICOM software
f:id:r_beginner:20170218215602j:plain
ちなみにpdfのマニュアルを見るときは、ZIPファイルの解凍先フォルダで

$ evince linuxmanual.pdf

です。

ではインストールを始めましょう。

sudo apt-get update
sudo apt-get  install g++ 
sudo apt-get -y install apache2 
sudo a2enmod cgi
sudo service apache2 restart

まず作業フォルダを作り、移動します。

mkdir conquest
cd conquest

つぎにPostgreSQLをインストールします。スーパーユーザーでデータベース(conquest)を作成します。

sudo apt-get -y install libpq-dev 
sudo apt-get -y install postgresql
sudo su                      # become superuser 
su – postgres                               # become postgres user 
psql                                        # set the password to postgres 
\password 
postgres 
postgres 
\q 
createdb conquest                           # create database conquest 
psql -l                                     # confirm database
exit 
exit

coquestフォルダーにZIPファイルを落としてきて、解凍し、コンパイルします。

cd conquest
wget http://ingenium.home.xs4all.nl/dicomserver/dicomserver1419.zip
unzip dicomserver1419.zip
chmod 777 maklinux
./maklinux         # compile and install web access 

f:id:r_beginner:20170219080202j:plain
2を選びPostgreSQLを選択します。

エラー出ますが無視。
f:id:r_beginner:20170218223303j:plain

conquestフォルダーで、

./dgate -v -r  # regenerate the database 
./dgate -v     # run the server 

ここもいろいろ言われますが…
f:id:r_beginner:20170218223557j:plain
f:id:r_beginner:20170218223612j:plain

これでサーバーは構築されています。ブラウザのアドレスバーに' http://localhost/cgi-bin/dgate?mode=top 'と入力すると。
f:id:r_beginner:20170218223816j:plain

次にクライアントのKPACSに接続するための設定です。

端末から、Ctrl+Cでサーバーを止めて、conquestフォルダを覗いてみます。

postgres@ubuntu:~/conquest$ ls -a

f:id:r_beginner:20170218224051j:plain

acrnema.mapが設定ファイルです。

gedit acrnema.map

f:id:r_beginner:20170218224245j:plain
KPServer(KPACS)のアドレスとポートを入力して、保存します。

./dgate -v

ブラウザで確認。
f:id:r_beginner:20170219080728j:plain

設定が反映されます。

クライアント側の設定も忘れずに。
f:id:r_beginner:20170218224541j:plain

これでKPACSとConquestが接続されているはずです。

Rstudio shortcut keys for writing code (Windows/Linux)


Introduction

To write code quickly like vim or emacs, it is better to use shortcuts. In this blog, I will explain shortcuts that I like and use frequently. For other shortcut keys which I don’t introduce ,please refer to the following site.


Transition

  • Move cursor to start of line : Home
  • Move cursor to end of line : End
  • Jump to word : Ctrl + Right/Left

Select Word

  • Ctrl + Shift + Right/Left

f:id:r_beginner:20170209180343g:plain


Select Line

  • Alt + Shift + Right/Left

f:id:r_beginner:20170211075438g:plain


Select All

  • Ctrl + A

f:id:r_beginner:20170211083124g:plain


Cut,Copy,Paste

  • Ctrl + X
  • Ctrl + C
  • Ctrl + V

Delete Line

  • Ctrl + D f:id:r_beginner:20170209180452g:plain

Yank line up to cursor/ after cursor

  • Ctrl + U/K f:id:r_beginner:20170209180523g:plain

Move Lines Up/Down

  • Alt + Up/Down f:id:r_beginner:20170209180654g:plain

Copy Lines Up/Down

  • Shift + Alt + Up/Down f:id:r_beginner:20170209180758g:plain

Ubdo,Redo

  • Ctrl + Z (e.g. after Ctrl+D)
  • Ctrl + Shift +Z f:id:r_beginner:20170211083654g:plain

(Un)Comment lines

  • Ctrl + Shift + C f:id:r_beginner:20170209180935g:plain

Insert ‘<-’ , ‘%>%’

  • Alt + -
  • Ctrl + Shift + M f:id:r_beginner:20170209181019g:plain

Reindent lines

  • Ctrl + I f:id:r_beginner:20170209181059g:plain

Select and Replace

  • Ctrl + Shift + Right/Left
  • Ctrl + Shift + Alt + M (Select -> Replace) f:id:r_beginner:20170211084018g:plain

Find and Replace

  • Ctrl + F
  • Ctrl + Shift + Alt + M (Find -> Replace) f:id:r_beginner:20170211084231g:plain

Find in Files

  • Ctrl + Shift + F

Add New Cursor Above/Below

  • Ctrl + Alt + :arrow_up:/:arrow_down: f:id:r_beginner:20170210081059g:plain

Reference

電子カルテのサンプルデータ② ~患者マスター~

今回は、患者マスターデータをMySQLに入れて、SQLの練習をしてみます。

[準備するもの]

  • R
  • Rstudio

インストールの仕方が分からなければ下記を参考にしてください。
r-beginner.hatenadiary.jp

まずは、MySQLと接続し、電子カルテ用データベース(ここではEHR)を作成します。
いくつかデータベースがあるので、USE EHRでデータベースを選択します。

library(RMySQL) 
con <- dbConnect(MySQL(), host="[IP address]", port=3306, dbname="mysql", user="root", password="mysql") 
dbGetQuery(con,"CREATE DATABASE EHR;")  # databaseの作成
dbGetQuery(con,"USE EHR;")        # databaseを選択

次に患者マスターを入れるテーブルを作成します。

dbGetQuery(con,"create table pt_master(facility_code int,id int,name char(40),kana char(40),gender char(20),birth char(20),address varchar(120));") 

患者マスターのサンプルデータをread.csvで読み込み、データフレームに入れておきます。(あらかじめcsvファイルを落としておいて、LOAD DATA INFILEの方が良いのかな…。)

library(RCurl)
# This is not actual patient data.
url <- getURL("https://raw.githubusercontent.com/Algo1970/EHR_data/master/pt_master_samplev2.csv")
df <- read.csv(text = url, header = TRUE)

データを確認

> df %>% tail()
     facility_code    id        name            kana
995        1234567 10995   金田 彩華   かねだ あやか
996        1234567 10996     藤森 兼   ふじもり けん
997        1234567 10997   木村 誠一 きむら せいいち
998        1234567 10998     足立 優     あだち ゆう
999        1234567 10999   小堀 一輝   こほり かずき
1000       1234567 11000 阿久津 一代   あくつ かずよ
     gender      birth address
995  female 1941-11-28  茨城県
996    male 1971-08-18  岐阜県
997    male 2016-01-13  沖縄県
998  female 1984-12-31  愛知県
999    male 2002-04-06  岐阜県
1000 female 1954-11-30  岩手県
> 

このdataframeを先程作成したpt_masterテーブルにinsertします。
また使うかもしれないので、pt_masterにinsertする関数を作っておいて、for文まわします。

into.ptmaster <- function(facility_code,id, name, kana, gender,birth,address){
  query3 <- sprintf("insert into pt_master (facility_code,id, name, kana, gender,birth,address) values (%s,%s,'%s','%s','%s','%s','%s');",
                    facility_code,id, name, kana, gender,birth,address)
  dbGetQuery(con,query3)
}
for (i in 1:nrow(df)){
  into.ptmaster(df$facility_code[i],df$id[i], df$name[i], df$kana[i], df$gender[i],df$birth[i],df$address[i])
}

確認してみましょう。

> dbGetQuery(con,"SELECT * FROM pt_master;") %>% tail()
     facility_code    id        name            kana
995        1234567 10995   金田 彩華   かねだ あやか
996        1234567 10996     藤森 兼   ふじもり けん
997        1234567 10997   木村 誠一 きむら せいいち
998        1234567 10998     足立 優     あだち ゆう
999        1234567 10999   小堀 一輝   こほり かずき
1000       1234567 11000 阿久津 一代   あくつ かずよ
     gender      birth address
995  female 1941-11-28  茨城県
996    male 1971-08-18  岐阜県
997    male 2016-01-13  沖縄県
998  female 1984-12-31  愛知県
999    male 2002-04-06  岐阜県
1000 female 1954-11-30  岩手県
> 

先程のデータフレームがpt_masterに入っています。準備は整いました。
以前ブログに書いた、人口ピラミッドのグラフを関数化しておきましたので、第一引数にpt_masterを読み込んだデータフレーム、第二引数にx軸の最大値を入力すると

make.pyramid <- function(df,x.max=40){
  # genderを変更
  df$gender <-as.character(df$gender) 
  df$gender[df$gender %in% c("m","male","M","Male","MALE","男","男性")] <- c("male")
  df$gender[df$gender %in% c("f","female","F","Female","FEMALE","女","女性")] <- c("female")
  # birthから年齢計算
  make.age <- function(birth){
    df <- NULL
    for(i in 1:length(birth)){
      df[i] <- (length(seq(as.Date(as.character(birth[i])), Sys.Date(), "year"))-1)
    }
    df
  }
  df$age <- make.age(df$birth)
  # 必要なカラムのみ取り出し
  df[,c("gender","age")]->temp
  result <- tapply(temp$age,temp$gender, hist, breaks=seq(0,100,5))
  paste(result$male$breaks,"-")->category
  category[1:(length(category)-1)]->category
  category <- factor(category,levels = category)
  temp_male <- data.frame(category=category,
                          counts=result$male$counts,
                          gender=rep("male",length(result$male$counts)))
  temp_female <- data.frame(category=category,
                            counts=result$female$counts*(-1),
                            gender=rep("female",length(result$female$counts)))
  temp_all <- rbind(temp_male,temp_female)
  # x軸範囲指定
  brks <- seq(-1*x.max, x.max, round(x.max/2,-1))
  lbls <- gsub("-","",as.character(brks))
  # plot
  ggplot(temp_all, aes(x = category, y = counts, fill = gender)) +   
    geom_bar(stat = "identity", width = .8) +   
    scale_y_continuous(breaks = brks,labels = lbls) + 
    coord_flip() +  
    labs(title="Population pyramid") +
    theme_tufte() +  
    theme(text=element_text(size=12, family="Comic Sans MS"), 
          plot.title = element_text(hjust = .5), 
          axis.ticks = element_blank()) +   
    scale_fill_manual(values=c("#9999CC","#CC6666"))
}

df <- dbGetQuery(con,"SELECT * FROM pt_master;")
make.pyramid(df,50) # 人口ピラミッドプロット関数

dbDisconnect(con) # 終わったらconnectionは切りましょう 

f:id:r_beginner:20170122145129j:plain

人口ピラミッド書くのがとても簡単になりました。データフレームの性別カラム名をgender、生年月日カラムをbirthにしておけば、他社の電子カルテデータでもいけそうです。

今後病名テーブルを追加する予定ですので、テーブルを結合すれば、疾患毎の人口ピラミッドを作成することも可能です。
経時的にピラミッドの形状がどう変わるか、可視化するのも面白いですね。GIFアニメーションとか…。