Lecture5: 条件文, Wordcloud

パッケージの読み込み

stringrパッケージ

library(stringr)

manipulate package

library(manipulate)

wordcloud package

library(wordcloud)
## Loading required package: RColorBrewer

関数ファイルの読み込み

source("getFreqMtx.R")
freqMtx<-getFreqMtx("Lec04-text.txt")
freqMtx<-freqMtx[order(freqMtx$raw, decreasing = TRUE),]
dim(freqMtx)
## [1] 609   2

前回の実習

課題1: 変数“freqMtx”に格納されているデータを使用して、以下の条件抽出をしなさい。

課題1-1:相対頻度数 0.01以上 0.04以下のデータ

freqMtx[freqMtx$relative>=0.01 & freqMtx$relativ<=0.04,]

課題1-2:先頭が“c”で始まり末尾が“ed”である単語

freqMtx[str_detect(rownames(freqMtx), "^c.+ed$"),]

補足:正規表現による単語検索

smallMtx2 <- freqMtx[freqMtx$raw >=2 & freqMtx$raw<3,]
View(smallMtx2)

先頭が数字である単語

smallMtx2[str_detect(rownames(smallMtx2), "^\\d"),]

先頭が数字である単語

smallMtx2[str_detect(rownames(smallMtx2), "^[0-9]"),]

wordcloud

Top20<- freqMtx[1:20,]
wordcloud(rownames(Top20),Top20$raw)

wordcloud(色付き)

wordcloud(rownames(Top20),Top20$raw,colors=rainbow(10))

条件分岐処理

条件文if

calcSQRT

calcSQRT<- function(value) {
    return(sqrt(value))
}

calc2ndPower

calc2ndPower<- function(value) {
  return (value^2)
}

実行

tmp <- 100
calcSQRT(tmp)
## [1] 10
calc2ndPower(tmp)
## [1] 10000

条件文1

分岐条件: 分類値

calcTest1 <- function(value, type=1){
  if(type==1){
      ans = calcSQRT(value)
  }else if(type==2){
      ans = calc2ndPower(value)
  }
  return(ans)
}

実行

calcTest1(100)
## [1] 10
calcTest1(100,2)
## [1] 10000

条件文2

分岐条件: 真偽値

calcTest2 <- function(value, sqrtFlag=FALSE){
  if(sqrtFlag==TRUE){
      ans = calcSQRT(value)
  }else{
      ans = calc2ndPower(value)
  }
  return(ans)
}

実行

calcTest2(100)
## [1] 10000
calcTest2(100, sqrtFlag=TRUE)
## [1] 10

条件文 switch

分岐条件: 分類値

calcTest3 <- function(value, type=1){
  ans <- switch (type,
    "1" = calcSQRT(value),
    "2" = calc2ndPower(value)
  )
  return(ans)
}

実行

calcTest3(100, type=1)
## [1] 10
calcTest3(100, type=2)
## [1] 10000

manipulate (インタラクティブなプロット)

棒グラフ

tmp <- freqMtx[1:20,1]
names(tmp) <-rownames(freqMtx)[1:20]
barplot(tmp,las=3)

色付き棒グラフ

color8 = c("red", "violet", "pink", "orange", "yellow", "green", "blue", "cyan") 
barplot(tmp, las=1,col=color8)

色の選択

  • picker()関数
manipulate(plot(0,0,pch=8,cex=5,col=myColors), myColors=picker("red", "violet", "pink", "orange", "yellow", "green", "blue", "cyan") )

プロットマーカーの選択

  • picker()関数
manipulate(
  plot(0,0,pch=myMarkers,cex=5,col=myColors), myColors=picker("red", "violet", "pink", "orange", "yellow", "green", "blue", "cyan",initial="violet"),
  myMarkers=picker(1,2,3,4,5,6,7,8,initial="5")
)

プロットサイズの選択

  • slider()関数
manipulate(
  plot(0,0,pch=8,cex=mySize,col="blue"),
  mySize=slider(1,10,initial=5)
)

manipulate関数の書き方(複数行の場合)

manipulate(
  {
  複数行にわたるスクリプト
  },
  picker, sliderの情報(複数の場合はカンマで結合)
)

Zipf’sの法則

\[Frequency=\frac{K}{Rank^A} \] K,A: 定数

K=freqMtx[1,1]
A=0.8

rank <- seq(1:dim(freqMtx)[1])
zipf <- K/rank^A

グラフ図:Zipf’sの理論式

plot(zipf, log="xy", type="l",col="red" ,
xlim=c(1,nrow(freqMtx)),ylim=c(1,50),main="Zipf's Law", xlab="Rank", ylab="Frequency")

頻度散布図&Zipf’sの理論式の重ね書き

par(new=T)
plot(rank,freqMtx[,1], xlim=c(1,nrow(freqMtx)), ylim=c(1,50),log="xy",pch=8, col="darkgreen", main="Zipf's Law", xlab="Rank", ylab="Frequency")

凡例をつける: legend

配置:“bottomright”, “bottom”, “bottomleft”, “left”, “topleft”, “top”, “topright”, “right”, “center”
ラベル
lty: 線の種類
pch: プロットの種類
legend("topright",c("Frequency","Zipf's law"),lty=c(NA,1),pch=c(8,NA),col=c("darkgreen","red"))

グラフ図

manipulate関数で定数Kを変化させる

title="Zipf's Law"
xlabel="Rank"
ylabel="Frequency"

A=0.8
rank <- seq(1:dim(freqMtx)[1])

manipulate(
  {
    zipf <- constK/rank^A
    plot(zipf, log="xy", type="l",col="red" ,
         xlim=c(1,nrow(freqMtx)),ylim=c(1,50),main=title, xlab=xlabel, ylab=ylabel)
    par(new=T)
    plot(rank,freqMtx[,1], xlim=c(1,nrow(freqMtx)), ylim=c(1,50),log="xy",pch=8, col="darkgreen", main=title, xlab=xlabel, ylab=ylabel)
    legend("topright",c("Frequency","Zipf's law"),lty=c(NA,1),pch=c(8,NA),col=c(col="darkgreen",col="red"))
    text(20, 50, "Frequency=K/Rank^A")
    text(20, 40, paste("K=", constK))
    text(20, 30, paste("A=", A))
  }
  , constK=slider(50,200, initial=freqMtx[1,1],step=10)
)

実習

課題1:

manipulate関数を使用し、(復習)棒グラフに対して、引数lasとcolをインタラクティブに表示させなさい。

  • 作成上の注意
    • 注意: lasに選択できる値は、1,2,3から選ぶ
tmp <- freqMtx[1:20,1]
names(tmp) <-rownames(freqMtx)[1:20]
color8 = c("red", "violet", "pink", "orange", "yellow", "green", "blue", "cyan") 
barplot(tmp, las=1,col=color8)

実行例

alt text

課題2:

manipulate関数を使用し、変数freqMtxの粗頻度数とそのZipf’sの理論式の散布図に対して、定数Aをインタラクティブに表示させなさい。

  • 作成上の注意
    • 定数Aは以下のように設定すること。
    • 範囲0.5-1.5, 初期値=0.8, step=0.05

実行例

alt text

課題3:関数の作成

wordcloudの白黒か色付き(rainbow(10))の選択を引数で指定して、条件分岐文で、白黒/色付き描画を分岐する関数を作成しなさい。

  • 作成上の注意
    • 関数の第1,2引数は、wordcloud関数の第1,2引数と同じにすること
    • 条件分岐のための引数(第3引数)や条件分岐文は自由に決めて構わない

実行結果例

Top20<- freqMtx[1:20,]
genWC(rownames(Top20),Top20$raw)

genWC(rownames(Top20),Top20$raw, colorFlag=1)