NAの取り扱いシリーズ第3段。
今回は、他のデータから予測できる場合にその情報を使って補完する方法。
他のデータを使って補完
例えば下記のようなデータフレームがあった場合、
"State" が<NA>になっているけど、隣の "City" がわかっていれば100%推測可能。
New Yorkはニューヨーク州(NY)だし、San Franciscoはカリフォルニア州(CA)。
とゆーことで、それぞれ "City" から予測して、"State" のデータを補ってみる。
まずは、
Dat[is.na(Dat$State) & Dat$City=="New York",]
とすると、"State" が <NA> で "City" が "New York" の行が抽出される。
で、この行の "State" に "NY" と入れたいので、
Dat[is.na(Dat$State) & Dat$City=="New York", "State"] <- "NY"
とすればOK。
その他の実例
ほぼほぼ個人の備忘録。
① Thal, Braak, CERADからABC criteriaでADNCの情報を追加する
私の手元にあるデータはThal Phase, Braak 6 stage, Braak 3 stage, CERAD scoreのデータがあるけど、ADNCがない。
これを、
- Braak 3 stage の空欄部分を、Braak 6 stage のデータから推測して補完する
- Braak6:1と2 → Braak3:1
- Braak6:3と4 → Braak3:2
- Braak6:5と6 → Braak3:3
- Thal, Braak3, CERADをABC criteriaに当てはめる
という2段階でADNCのデータを作っていきたい場合。
Braak6のデータから予測してBraak3のデータを補完
Braak3は、Braak6を半分して、少数は繰り上げれば良いので、下記のような感じ。
w <-which(is.na(Dat$Braak03) & !is.na(Dat$Braak06)) # Braak03がNAでBraak06にデータがある行を抽出
Dat$Braak03[w] <- Dat$Braak06[w]/2 # Braak6の値を1/2にする
Dat$Braak03[Dat$Braak03==0.5] <- 1 # 0.5は1に繰り上げる
Dat$Braak03[Dat$Braak03==1.5] <- 2 # 1.5は2に繰り上げる
Dat$Braak03[Dat$Braak03==2.5] <- 3 # 2.5は3に繰り上げる
Thal Phase, Braak3, CERADのデータをABC criteriaに当てはめてADNCのデータを作製
ABC criteriaは下記のような感じ。
上表を元に、
- ADNCの列を作成
- ADNCの列に、ABC criteriaを元にしたADNCのデータを追加
の順で作っていく。
mutate(Dat,ADNC=Braak03) # ADNCという列を作る
Dat$ADNC[Dat$ABeta ==0 & Dat$CERAD ==0] <- 'Not' # 'Not' の条件を入れる
Dat$ADNC[Dat$ABeta> 0 & Dat$Braak03<=1] <- 'Low' # 'Low' の条件を入れる
Dat$ADNC[Dat$ABeta==1 & Dat$CERAD<=1] <- 'Low' # 'Low' の条件を入れる
Dat$ADNC[Dat$ABeta==1 & Dat$CERAD>=2 & Dat$Braak03<=1] <- 'Low' # 'Low' の条件を入れる
Dat$ADNC[Dat$ABeta==1 & Dat$CERAD>=2 & Dat$Braak03 >=2] <- 'Intermediate' # 'Intermediate' の条件を入れる
Dat$ADNC[Dat$ABeta==2 & Dat$Braak03>=2] <- 'Intermediate' # 'Intermediate' の条件を入れる
Dat$ADNC[Dat$ABeta==3 & Dat$CERAD<=1 & Dat$Braak03>=2] <- 'Intermediate' # 'Intermediate' の条件を入れる
Dat$ADNC[Dat$ABeta==3 & Dat$CERAD>=2 & Dat$Braak03 ==2] <- 'Intermediate' # 'Intermediate' の条件を入れる
Dat$ADNC[Dat$ABeta==3 & Dat$CERAD>=2 & Dat$Braak03 ==3] <- 'High' # 'High' の条件を入れる
② 他のデータフレームから情報を持ってくる場合
例えば、Dat_NFTcountのデータフレームには Areaの列の情報がなくて(NA)
Dat_NFTのデータフレームにあるAreaの情報を当てはめたい場合。
左の列の "ImageID" が共通項なので、
「Dat_NFTcount の "ImageID" が Dat_NFT の "ImageID" と同じ行の "Area" の列の値を当てはめる」という形にする。
1.列のベクターとして指定する場合は下記。
# Dat_NFTcount$Area という列ベースで指定する場合
Dat_NFTcount$Area[Dat_NFTcount$ImageID==Dat_NFT$ImageID] <- Dat_NFT$Area
2.行列で指定する場合は下記。
# Dat_NFTcountのデータベースで指定する場合
Dat_NFTcount[Dat_NFTcount$ImageID==Dat_NFT$ImageID, "Area"] <- Dat_NFT[,"Area"]