読者です 読者をやめる 読者になる 読者になる

疫学と医療統計学と遺伝学と時々、大学院生活

疫学を専門とする大学院生の研究に関する備忘録的ページ。

R 役に立つ小技5選

今回はデータハンドリングで役に立つ小技を5つだけ紹介する。(個人的に忘れやすいが、意外と役に立つものをpick upする)

NO.1 「『不正なマルチバイト文字があります』のエラーを出ないようにする(おそらくmac OS Xのみ)」

このエラーについてはexcelの保存方法を変更するだけで解決するが、そのようなことを気にしなくても魔法のコマンド「fileEncoding="cp932"」で解決出来る。(csvを読み込むこととする。)

データ名 <- read.csv("データ名.csv", header=T, sep=",", fileEncoding="cp932")

NO.2 「ある値を任意のクラスに分けて、そのクラスに含まれるデータの数、percentage、累積のpercentageを返す関数」

小技ではないが、クラスを分割し、クラス内の人数や割合を求めるのに有効な関数

freqtab <- function(
x, # データのベクタ
cn=1+log2(length(x)), # 階級数 cn はスタージェスの公式
wid=FALSE) # 階級幅を指定する
{
x <- x[!is.na(x)] # 欠損値を除く
min <- min(x) # データの最小値
max <- max(x) # データの最大値
ran<-max-min # データが含まれる範囲
if(!wid){ wid <- round(abs(ran/cn), 3) } # 階級幅を自動計算
cla <- floor(x/wid) # 階級に分ける
mnc <- min(cla) # 階級の最小値 
mxc <- max(cla) # 階級の最大値
cla <- factor(cla, levels=mnc:mxc) # 度数0でも数える
freq <- table(cla) # 度数を数える
names(freq) <- paste(mnc:mxc*wid, "-", mnc:mxc*wid+wid) # 階級名を付け直す
percent <- freq/sum(freq)*100 # 相対度数
cum.pcnt <- cumsum(percent) # 累積相対度数
return(cbind(freq, percent, cum.pcnt)) # 度数分布表
}

上のコマンドでfreqtab関数を作成した後、以下のコマンドを実行する。

freqtab(データ名$列名, wid=階級の幅)

NO.3 「ある値で層別化した場合の要約統計量を求める」

例えば、性別ごとに要約統計量を求める

by (データ名, データ名$層別化したい列, summary)

NO.4 「指定の値を持つ行(サンプル)の除外」

which関数とマイナスを利用する簡単な方法。orやand(|もしくは&)で繋げば、複数項目に適応できる。除去した後のデータセット名には注意。

新データ名 <- 元のデータ名[-which(元のデータ名$列名=="指定の値"), ]

NO.5 「列の中で大きい値を10個選ぶ」

例えば、外れ値を除外した後にmax近辺にある数値はどのようなものか確認する場合に用いる。

tail(sort(データ名$列名), 10)

非常に簡単であるこれらのコマンドも意外と出番は多いかも。(編集したり、組み合わせるとさらに強力になる!!)
ぜひお試しあれ


20160202
RF