# ←この記号の後は次の改行までコメントになります。

# データフレームの読み込みと選択基準の適用

# 今までのレッスンでは、Rの基本ルールの解説ばかりが続いて飽きてきて
# しまったのではないでしょうか?
# 今回はワークシートからデータを読み込んで、その一部を選択するという
# ことをやってみて、臨床研究の解析第一段階を体験してみましょう。

# 臨床研究のデータセットは、多くの研究者はエクセルなどのワークシートで
# 作っていることが多いでしょう。私もこういうシートを添付したメールで、
# こういう解析をしてくださいと、今まで数え切れないくらい頼まれましたが、
# 送られてきたシートをそのままの形でRに読み込んですぐに解析できたことは
# 一度もありません。
# 
# こういうシートは、作者だけがわかるようなフォーマットで作られていて、初
# めてこのシートを見た人(Rも含む)は理解できないことがほとんどです。
#
# Rのコードに移る前に、一般化出来るシートの作り方を簡単に押さえておきます。
#
# 1. フォーマットはcsv(カンマ区切り値)で
# 2. シートは一枚だけ。予めシートを分けて群分けすると読み込みが煩雑になり
#    整合性がとれないことがあり、解析が煩雑になります。
# 3. シートの先頭行の1行「のみ」に変数名を書いて下さい。2行目からデータを。
# 4. 1セル1情報の原則、1つのセルには1人の患者の1種類の情報しか入れてはいけ
#    ません。
# 5. ワークシートのn * mの領域の外には何も書かないで。平均値とか書いてある
#    ことが多い。
# 6. 機種依存文字などの特殊文字は使わない。できれば、日本語も使わないほう
#    が良い。
# ではコードを書いてみましょう。

# まずはデータ空間(Environment)をいったんクリアします。
rm(list=ls())

# ワークシートを作り、ディスクに保存します。Lesson 5で使ったものを修正して
# 流用します(サンプル数を20に増やし、変数を2つ追加しました)。
dataset.lesson5<-
  data.frame(
    Age=
      as.numeric(c(63,82,62,58,71,60,64,74,89,72,74,72,66,84,74,82,65,66,67,57)),
    Sex=
      factor(c("Male","Male","Female","Male","Female","Female","Male","Male","Male","Female",
               "Female","Male","Male","Male","Male","Female","Male","Male","Male","Female")),
    FirstEver=
      factor(c(2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2),
             labels=c("No","Yes")),
    Stage=
      ordered(c(1,3,2,2,4,1,3,2,2,3,4,2,1,2,1,3,3,3,2,2),
              labels=c("I","II","IIIa","IIIb")),
    OtherMalignancy=
      factor(c(1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1),
             labels=c("No","Yes"))
  )

# write.csv関数を使って保存します。
write.csv(dataset.lesson5,"data5.csv")
# ディレクトリ(パス、フォルダ)の指定がありませんが。
# 未指定の場合、作業ディレクトリ(working directory)に保存されます。
# working directoryを知るには、
getwd()
## [1] "/Users/Atsushi 1/R/REducation"
# setwd関数を使えば、working directoryを指定できます。

# 一旦作ったデータセットを削除しておいて、
rm(dataset.lesson5)

# ディスクに保存したファイルを、read.csv関数を使って読み込みます。これが
# csvファイルを読み込む方法です。ここからがスタートです。
dataset<-
  read.csv("data5.csv",header=T)
summary(dataset) # 全体の記述統計
##        X              Age            Sex     FirstEver  Stage  
##  Min.   : 1.00   Min.   :57.00   Female: 7   No : 1    I   :4  
##  1st Qu.: 5.75   1st Qu.:63.75   Male  :13   Yes:19    II  :8  
##  Median :10.50   Median :69.00                         IIIa:6  
##  Mean   :10.50   Mean   :70.10                         IIIb:2  
##  3rd Qu.:15.25   3rd Qu.:74.00                                 
##  Max.   :20.00   Max.   :89.00                                 
##  OtherMalignancy
##  No :18         
##  Yes: 2         
##                 
##                 
##                 
## 
nrow(dataset) # サンプル数
## [1] 20
# 一般的にはExcelなどの表計算ソフトで作成したものをcsvとして保存し、それを
# Rに読み込むことが多いでしょう。

# 日本語が入っていて、shift-JISのコーディングが必要な場合、
# read.csv(..., fileEncoding="CP932")
# として、Shift-JISで読み込むように宣言すると通ります。
# やらないと日本語を含むファイルではエラーになります。けっこう大事。

# ここで、このデータセットの中から、
# 選択基準: 60歳以上の初発例(FirstEverがYes)
# 除外基準: Stage I, 他の悪性腫瘍の合併(OtherMalignancyがYes)
# として症例を選択してみましょう。

# 選択基準
Inc.criteria.1<-
  dataset$Age>=60 # 年齢が60歳以上
Inc.criteria.2<-
  dataset$FirstEver=="Yes" # 初発
table(Inc.criteria.1)
## Inc.criteria.1
## FALSE  TRUE 
##     2    18
table(Inc.criteria.2)
## Inc.criteria.2
## FALSE  TRUE 
##     1    19
# 組み入れ基準(Inclusion criteria)は、「全ての基準を満足するもの」を選びます。
# & はExcelで言う AND です。全てTRUEのものがTRUEに、それ以外がFALSEになる。

Inc.criteria<-
  Inc.criteria.1&Inc.criteria.2
table(Inc.criteria)
## Inc.criteria
## FALSE  TRUE 
##     3    17
# まず、組み入れ基準を適用したdataset.1を作ってみましょう。
# subset関数は、元のオブジェクトから条件を満たすものを選択します。
# この場合は元のdatasetから、組み入れ基準が真であるものを選択しています。
dataset.1<-
  subset(dataset,Inc.criteria)
summary(dataset.1)
##        X               Age            Sex     FirstEver  Stage  
##  Min.   : 1.000   Min.   :60.00   Female: 6   No : 0    I   :4  
##  1st Qu.: 6.000   1st Qu.:65.00   Male  :11   Yes:17    II  :6  
##  Median :10.000   Median :72.00                         IIIa:5  
##  Mean   : 9.882   Mean   :71.82                         IIIb:2  
##  3rd Qu.:14.000   3rd Qu.:74.00                                 
##  Max.   :19.000   Max.   :89.00                                 
##  OtherMalignancy
##  No :15         
##  Yes: 2         
##                 
##                 
##                 
## 
nrow(dataset.1)
## [1] 17
# 除外基準(対象は組入れ基準後を適用した後のdataset.1であることに注意!)
Exc.criteria.1<-
  dataset.1$Stage=="I"
Exc.criteria.2<-
  dataset.1$OtherMalignancy=="Yes"

# 除外基準は「一つでも基準に合致するもの」を除きます。
# | はExcelで言う OR です。ひとつでもTRUEのものがTRUEに、全部がFALSEだとFALSEになる。
Exc.criteria<-
  Exc.criteria.1|Exc.criteria.2
table(Exc.criteria)
## Exc.criteria
## FALSE  TRUE 
##    11     6
# 次に除外基準を適用したdataset.2を作ってみましょう。
# この場合のsubset関数は、元のdataset.1から除外基準が偽であるものを選択しています。
# ! はExcelで言う NOT です。TRUEはFALSEに、FALSEはTRUEになります。
dataset.2<-
  subset(dataset.1,!Exc.criteria)
summary(dataset.2)
##        X              Age            Sex    FirstEver  Stage  
##  Min.   : 3.00   Min.   :62.00   Female:5   No : 0    I   :0  
##  1st Qu.: 7.50   1st Qu.:68.00   Male  :6   Yes:11    II  :5  
##  Median :10.00   Median :72.00                        IIIa:4  
##  Mean   :10.18   Mean   :73.55                        IIIb:2  
##  3rd Qu.:13.00   3rd Qu.:78.00                                
##  Max.   :17.00   Max.   :89.00                                
##  OtherMalignancy
##  No :11         
##  Yes: 0         
##                 
##                 
##                 
## 
nrow(dataset.2)
## [1] 11
# 11例が選択されました。

# [...] bracketを使って、以下のように選択することもできます。bracketは[...]の中の
# 条件を満たすものを選択します。[行の条件,列の条件]と記載することで、二次元の配列
# に適用することもできます。
dataset.1<-dataset[Inc.criteria,]
dataset.2<-dataset.1[!Exc.criteria,]
summary(dataset.2)
##        X              Age            Sex    FirstEver  Stage  
##  Min.   : 3.00   Min.   :62.00   Female:5   No : 0    I   :0  
##  1st Qu.: 7.50   1st Qu.:68.00   Male  :6   Yes:11    II  :5  
##  Median :10.00   Median :72.00                        IIIa:4  
##  Mean   :10.18   Mean   :73.55                        IIIb:2  
##  3rd Qu.:13.00   3rd Qu.:78.00                                
##  Max.   :17.00   Max.   :89.00                                
##  OtherMalignancy
##  No :11         
##  Yes: 0         
##                 
##                 
##                 
## 
nrow(dataset.2)
## [1] 11
# 条件式や論理値の扱いは最初は面食らいますが、以上のように臨床研究で選択基準を適用
# したりサブグループを選択する際にとても重要で繁用しますので、慣れておいて下さい。