Home‎ > ‎ProgramTool‎ > ‎

R

http://www.r-project.org/
http://cran.md.tsukuba.ac.jp/
http://cran.r-project.org/bin/macosx/

090107_14_46
2.8.1になってた。2008年だけで8回もバージョンアップしていて、最近の注目の高さが伺える。
OSX版もちゃんと2.8.1になってた。
今入っているのをみたら、2.7.0だったのでアップデートしておく。


参考ページ

http://aoki2.si.gunma-u.ac.jp/R/
http://cse.naro.affrc.go.jp/takezawa/r-tips/r.html
http://www.okada.jp.org/RWiki/
http://www.is.titech.ac.jp/~mase/R.html

とりあえず触る

つか、2万行ほどのExcelのピボットが死ぬほど遅いので、こないだインストールしたはいいが
わかんないのでほっぽっていたRに再度チャレンジ。

(ピボットで、グループ化を手作業でやってたのだが、一つグループ作るたびに
数分フリーズしたみたいに止まってしまう。何が、そんなに時間かかってるのだろうか。)

x <- read.csv("PV_rankingutf8.csv",header=T)  #csv読み込み
ちなみに、5s ぐらいで読み込んでくれた。

print(x)      #xの内容表示 2万行とかのデータだと、表示するだけで数秒かかるのでやめておこう。
summary(x)  #内容の簡単な集計

これで良いのか疑問だが、ある文字列要素が正規表現に一致するモノを抽出

 y <- subset(x,regexpr("^/zakka/.*",x$ページ)!=-1)

#最初grepとかでやろうとしていたのだけど、戻り値が integer(0)とか、判定を行ってもlogical(0)とか
戻ってきてどうにもならなかった。で、regexprにしたらあっさり。

sum(as.integer(y$PV))  #合計
mean(as.integer(y$PV)) #平均
max(as.integer(y$PV))
min(as.integer(y$PV))
median(as.integer(y$PV)) #中央値
var(as.integer(y$PV)) #分散

length(y) #列数
length(y$PV)  #行数

cor.test(as.integer(y$PV),as.integer(y$Visit)) #相関係数

これでも、当初の目的は大体果たせたりするのだが、
せめて自動的に要素をとってきて、集計させたい。
で、列を追加するのはどうしたらいいか、調べる。

x[1,1,drop=FALSE]
y <- cbind(x,regexpr("^/zakka/.*",x$ページ))  #列を追加するテスト

次に、ある列の中から正規表現で検索して、文字列を抽出したい。
つまり、この場合、ドキュメントルート以下のディレクトリだったりするわけだが

sub("/*(.*?)/.*","¥¥1","///test/test1/test2.html/",perl = TRUE )  #正規表現で、一段目のディレクトリを取得
※JotSpotはバックスラッシュがテキストモード開くたびに増えるので ¥で代用
なので、

sum(as.integer((subset(x,regexpr("^/Items/.*",x$ページ)!=-1))$PV)) #で、特定のディレクトリの集計はできるね

このままだと、正規表現の条件そのものがラベルになってうっとおしい。
---
summary(y[[13]])
colnames(y)[13] <- "dir" #ラベル付け
---
も一度やりたいことまとめ

x <- read.csv("PV_rankingutf8.csv",header=T)
y <- cbind(x,sub("/*(.*?)/.*","¥¥1", x$ページ,perl = TRUE ))

colnames(y)[length(y)] <- "dir" #ラベル付け

z <- xtabs( as.integer(y$PV) ~ dir,y)

× ftable(xtabs( as.integer(PV) ~ dir ,y,exclude = c(NA, NaN)))

 apply( as.integer(y$PV), 2, sum ,na.rm = TRUE)

y[y$dir=="goods",2]

by(as.integer(y$PV) ,y$dir,sum)

http://cse.naro.affrc.go.jp/takezawa/r-tips/r/44.html

z <- tapply(as.integer(y$PV),y$dir,sum,simple=F)
labels(z)
zz<- as.data.frame(z)

zz <- data.frame(z)
zzz <- cbind(zz,labels(z))
write.csv(zzz,"test.txt")

write.csv(zz,"test.txt")

write.table(cbind(data.frame(z),labels(z)),"test.txt",sep ="¥t",quote=F)

バインドなんてしなくていいじゃんと言うことがわかった

---
で、結局やりたかったことは
z <- xtabs( as.integer(y$PV) ~ dir,y)
zz <- sort(z,decreasing = T)
write.table(data.frame(zz),"test.txt",sep ="¥t",quote=F)
---
sink("output.txt")
---
じゃ、以下をファンクションにまとめてみようか。

x <- read.csv("PV_rankingutf8.csv",header=T)
y <- cbind(x,sub("/*(.*?)/.*","¥¥1", x$ページ,perl = TRUE ))
colnames(y)[length(y)] <- "dir" #ラベル付け
z <- xtabs( as.integer(y$PV) ~ dir,y)
zz <- sort(z,decreasing = T)
write.table(data.frame(zz),"test.txt",sep ="¥t",quote=F)

ファイル名を任意にして、取得する列は指定したいかな。
まとめてやっちまった方が楽かなぁ。

転置行列
t(z)
とかでできるのだが、ここではまともに使えなかった。

zのところからやり直すと、
z <- tapply(as.integer(y$PV), y$dir, sum)
zz <- cbind(data.frame(z),tapply(as.integer(y$Visit), y$dir, sum))
colnames(zz)[2:3] <- c("PV","Visit")
write.table(zz[order(zz$Freq,decreasing =T),],"test.txt",sep ="¥t",quote=F)

カンマ区切り数値(文字列)を数値に
a <- "234,456"
b <- strsplit(a,",")
as.integer(paste(b[[1]][1],b[[1]][2],sep = ""))
なぁんてことをやる羽目になるので、読み込み前に直しておくのが吉のようだ。

---
で、書き直し
x <- read.csv("PV_rankingutf8.csv",header=T)
y <- cbind(x,sub("/*(.*?)/.*","¥¥1", x$ページ....,perl = TRUE ))
colnames(y)[length(y)] <- "dir" #ラベル付け
z <- xtabs( y$PV ~ dir,y)
zz <- cbind(data.frame(z),tapply(y$Visit, y$dir, sum))
colnames(zz)[2:3] <- c("PV","Visit")
write.table(zz[order(zz$PV,decreasing =T),],"test.txt",sep ="¥t",quote=F)

もう、ただの作業ログ w

x <- read.csv("se_keywordutf8.csv",header=T)
y <- cbind(x,sub(".*?(google|yahoo|msn)(.*)","¥¥1", x$検索.エンジン....,perl = TRUE ))
colnames(y)[length(y)] <- "engine" #ラベル付け
y <- cbind(y,sub(".*?(社名|社名の別名|大文字|ひらがな|間違い)(.*)","社名関連", x$検索用語....,perl = TRUE,ignore.case =T ))
colnames(y)[length(y)] <- "fancl" #ラベル付け
write.table(y[order(y$数,decreasing =T),],"test.txt",sep ="¥t",quote=F)

z <- xtabs( y$数 ~ engine,y)
z <- xtabs( as.integer(y$数) ~ 検索.エンジン....,y)
z <- xtabs( as.integer(y$数) ~ 社名関連,y)
z <- xtabs( as.integer(y$数) ~ 検索用語....,y)
z <- xtabs( as.integer(y$数) ~ X.ページ.....,y)
z <- aggregate(y$数,list(y$engine,y$社名関連),sum) #クロス集計

時間の変換
z$平均セッション時間 <- sub("(.*):.*","¥¥1",z$平均セッション時間)+sub(".*:(.*)","¥¥1",z$平均セッション時間)

クラスタにしてみる
x <- read.csv("PV_rankingutf8.csv",header=T)
z <- x[order(x$PV,decreasing =T),]
y <- z[c(1:100),c(3,4,5,6,8,10,11)]
rownames(y) <- z[c(1:100),1]
hc <- hclust(log2(dist(y[1:70,])), "ave")
plot(hc,cex=0.7)

hc <- hclust(log2(dist(y[1:70,])), "single")
hc <- hclust(log2(dist(y[1:70,])), "complete")
hc <- hclust(log2(dist(y[1:70,])), "mcquitty")
とか、距離算定方法はいろいろあるみたい。average がユークリッド距離で、一番一般的なのかな。

080805_09_58
ヒストグラムを書くのに、
histogram(~ Q1_RB_01 |kind , data = z)
とかやっていたのだが、for ループの中で回したときに、
画像書き出しがうまくいかないことに気がついた。

ちなみに画像書き出しは、下記のような感じでおこなえる。
jpeg("01.jpg")
histogram(~ Q1_RB_01 |kind , data = z)
dev.off()

結局、histを使えばうまくいくらしいということで、下記のようになった。
もちろん、もっとスマートにかけるとは思うのだけど、とりあえずこれで目的は達したので
よしとする。

#ちなみにzは、グローバルでつくったdataframeオブジェクト。
Rって、あまりオブジェクト指向っぽくない気もする。

histmisc1 <- function() {
    jpeg(filename="%03d.jpg");
    for (i in 1:30){
        op <- par(mfrow=c(3, 3))
        for( j in 1:8){
            target <- subset(z,kind==j ,select= i);
            hist( target[,1],br=c(0.5:4.5),col= j,labels = TRUE, main =j, xlab=j,ylim =c(0, 1),freq=F)
            #hist( target[,1],br=c(0.5:4.5),col= j,labels = TRUE, ylim =c(0, 20) ,main =j, xlab=j)
        }
    }
    dev.off()
}

サブページ (1): データマイニング入門
Comments