Rでよく使うコードまとめ
備忘録です。
たまーに大量のデータ編集をすることがあって、プログラム処理させることがあります。頻繁ではないのですぐコードを忘れちゃうんですね。
オンライン上に残しておけば普段と違う環境で作業するとき(いつかそんな時があるはず。きっと。)に役に立つはず...。
ちなみに大学時代からの名残りでRユーザーです。ただ、大学時代とは違って統計解析をする機会は少ないので、主にデータ編集で使うコマンドの整理となっています。
では!さっそくよく使っていたコードを独り言のような整理とともに書き連ねることとします。
○ディレクトリの変更
setwd("c:/usr")
いろんなフォルダに散らばったファイルを連続的に処理するときにはディレクトリの変更もコードで書いた方がいい。これと「sprintf」を多用してたなぁ。
○ファイルのコピー
dataA <- read.csv("Case02.csv",head=T)
m <- length(dataA[,1])
for (j in 1:m)
{
fromname <- sprintf("H:/data/acc_%s.out",dataA[j,"bor_name"])
outname <- sprintf("D:/data/%s" ,dataA[j,"G"])
file.copy(fromname,outname,1) #要はここだけ
}
データ名前とかが業務で使ったものそのままなので、ちょっと参考にはならないと思いますスミマセン。
○オブジェクトの一括削除
rm(list = ls(all.names = TRUE))
前に使っていたオブジェクトのログをそのまま次の解析でも使ってしまうことがあるのが嫌なので、私は頻繁にこれ使います。意図しないデータを読んだまま間違った解析を進めてしまうのを防ぐためです。
○作業ディレクトリ内のファイルリストの作成
files <- list.files()
out.files <- files[grep("\\.out$", files)] #「.out」をリストアップ
#outファイルに対して図化
for (i in 1:length(out.files))
{
data <- read.table(out.files[i],skip=2)
plot(data,type="l")
}
ごった返したフォルダの中から特定の拡張子を持つデータ群に対して処理するとき。
○readの工夫
read.table("data.dat",fill=T,nrow=100) #fill=Tで欠損値があっても読み込める, nrowで行数指定
欠損値があるデータを対象に作業することもよくあるので、fillは重宝してました。
○データの一括読み込み
lf <- list.files(path ="C:/dataA", full.names = T)
dataA <- lapply(lf,read.csv)
data_bind <- do.call(rbind, data)
write.csv(data_bind,"dataAall.csv")
一括で読み込んで、行方向に結合して、書き出しするコードですね。
○1行ずつ読み込み
files <- list.files()
m <- length(files)
for(z in 1:m)
{
f<-file(files[z],"r")
out <- NULL
for(i in 1:1000)
{
aa <- readLines(con=f,1)
out <- rbind(out,aa)
}
outname <- sprintf("s_%s.par",files[z])
write.table(out,outname,quote=F,col.names=F,row.names=F)
}
fortranで処理するためのデータファイルをRで無理やり処理するときによく使いました。絶滅危惧種なfortranですが、周りにはまだバリバリ使ってる人がいましたな。
○文字列の結合
inname1 <- c("AAA")
inname2 <- c("BBB")
inname3 <- paste(inname1,inname2,sep="") #sepがないと空白が挟まれる
> inname3
[1] "AAABBB"
ファイルを書き出すときの名前を作るときにたまに使う。
○文字列の置換
dna <- c("AAGCAT", "TAATAA", "CCTAT")
> sub("TA", "ta", dna) #条件に合ったもののうち最初の1つだけを置換
[1] "AAGCAT" "taATAA" "CCtaT"
>gsub("TA", "ta", dna) #条件に合ったものすべてを置換
[1] "AAGCAT" "taAtaA" "CCtaT"
最大値の行データを抽出するときとかによく使ってたかな。
○最も値の近い行番号を抽出
dataA <- read.table("waveA.dat",head=F,skip=2)
dataB <- read.table("waveB.dat",head=F,skip=2)
maxacc <- max( dataA[,"acc"] )
gacchi <- which( abs(dataB[,"acc"]-maxacc) == min(abs(dataB[,"acc"]-maxacc)) )
gacchiっていう名前の付け方が懐かしい。
○偶数行のみ抽出
evendata <- dataA[dataA$no %% 2 == 0 & dataA$no != 0,]
シンプルかつ有用なコードでした。はい。
○条件に合致する行番号を抽出
# grep
dataA <- read.table("waveA.dat",head=F,skip=2)
dataB <- read.table("waveB.dat",head=F,skip=2)
maxcol <- grep( max(dataA[,"acc"]), dataB[,"acc"] )
#match
maxcol <- match( max(dataA[,"acc"]), dataB[,"acc"] )
パターンマッチはgrep
完全一致はmatch
ほとんどmatch派でした。
○データの並び替え
ordar(data) #昇順
order(data, decreasing = TRUE) #降順
あまり使ったことはないけど目についたので一応メモメモ。
○データの概要の把握
sumamry(data) #要約統計量
head(data,3) #3行目までを表示
tail(data,3) #末尾3行目までを表示
plot(data)
基本中の基本のコードなのでもはやメモする意味もないかと思いつつ一応メモする堅実で生真面目な私。
○出力の桁数と位置を整列
data <- read.table("wave.dat",head=F,skip=2)
aa <- sprintf("%13.8f", data[,1]) # %〇.△f ,全部で〇桁、小数点部分△桁
bb <- sprintf("%12.4E", data[,2]) # Eは指数
out <- cbind(aa,bb)
outname <- sprintf( "acc_%03.0f.dat",max(abs(data[,2])) ) # 0で埋める
write.table(out,
outname,
quote = F, #TRUEの場合は二重引用符(" ")で囲まれる
row.names = F, #行ヘッダーの出力有無 TRUEで出力
col.names = F, #列ヘッダーの出力有無 TRUEで出力
)
csvではなくて、テキストファイルで色々と作業するようになってから、出力の仕方に凝るようになったのだ。
○列・行の名前を消す、付ける
rownames(data) <- NULL #行の名前を消去
colnames(data) <- NULL #列の名前を消去
names(dataA) <- c("time","acc")
特筆すべきことなし。押忍。
○ writeの工夫
write.table(output, "L2spcII_G1_08.dat",
append = FALSE, #TRUEで追加で書き込み
quote = F, #TRUEで「""」ありのまま
sep = " ", #デリミタを指定 タブは"\t"
eol = "\n", #行末の改行コード
na = "NA", #欠損値に対する文字列
dec = ".", #小数点に使用する文字
row.names = F, #TRUEで行ヘッダーの出力
col.names = F, #TRUEで列ヘッダーの出力
qmethod = c("escape", "double"), #文字列にある二重引用符に対処する方法を指定する文字列
fileEncoding = "" #file名 空白にするとコンソールに出力
)
appendを意外と使うんですよ。
○簡単な統計分析
data <- findata[,c("FC2","N1","Vs","ec","IP","IP2","sWP0.1","sWP0.5","sWP1","sWP5","sWP10","sWP50")]
dataset <- findata[,c("FC2","N1","Vs","ec","WP0.5")]
round(cor(findata),4) #相関係数の算出
pairs(dataset,pch=21,bg="red",cex=2) #相関図の作成
(dataset.lm<-lm(sWP0.5~.,data=dataset)) #W0.5を目的変数,その他を説明変数とする重回帰モデル
summary(dataset.lm)
重回帰くらいなら今でもたまにやります。
○回帰式の精度を診断する
par(mfrow=c(2,2),oma = c(1,1,2,1),mar = c(4, 4, 2, 1))
plot(dataset.lm,pch=21,bg=2,col=2,cex=1.5)
これはグラフの読み方を残しとかないと絶対よくわからなくなる。
左上について、横軸が予測値、縦軸が残差(実測地ー予測値)。当てはめが悪いデータにはラベルがつく。
右上について、横軸をてこ比、縦軸を「基準化した残差」。対象とした1つのデータが、回帰モデルに与える影響度を調べる。全データを用いた場合の回帰係数と、対象としたデータ1点を除いた場合の回帰係数を求め、影響が大きい、すなわち特異なデータにはラベルがつく。Cook's Distanceが0.5以上、特に1.0以上の場合は特異なデータと考える。
右下は横軸が予測値、縦軸が「基準化した残差の絶対値の平方根」。
最後に左下は正規Q-Qプロットを呼ばれるもので、正規分布に従っている場合は点が直線状に並び、正規分布に従っていない場合は直線から外る。
以上です。
ああ〜いい整理になりました。満足です。
ではでは。
この記事が気に入ったらサポートをしてみませんか?