jnobuyukiのブログ

研究していて困ったことやその解決に関するメモ。同じように困ったあなたのために。twitter ID: @j_nobuyuki

R言語での計算の繰り返しのバリエーション

R言語は,統計解析に用いられるプログラミング言語です。プログラミング言語なので,他のプログラミング言語にあるような繰り返し計算や条件分岐などを行えます。今回は,R言語における繰り返し計算の方法をまとめます。

for関数による繰り返し

for関数では,繰り返しの回数を()の中で指定し,{}の計算を繰り返し行います。()内は 添字をその範囲を次のように指定します。

for (添字 in 開始番号:終了番号)

例えば1から10までの数をすべて足し合わせるなら(通常はsum関数を使えば良いです)次のように繰り返し計算で求められます。

res <- 0 #結果を示すためのオブジェクト
for (i in 1:10){
    res <- res + i #累積した和にi番目の数を加える
}
print(res)

while関数による繰り返し

while関数では()内に計算の繰り返しを終了する条件を記入します。この条件が満たされるまで{}内の計算が繰り返されます。先程の1から10までの数をすべて足し合わせる計算をwhile関数では次のようにかけます。

res <- 0 #結果を示すためのオブジェクト
x <- 1 #条件判定の基準となるオブジェクト

while (x <= 10) {
    res <- res + x
    x <- x + 1
}
print(res)

repeatによる繰り返し

repeatを用いる方法もあります。repeatには()がつかないので,関数と呼んでいいのかわからないのですが,とにかく条件を満たすまで計算を繰り返します。繰り返し終了の条件判定も{}内で行う点がwhile関数と異なります。

res <- 0 #結果を表示するためのオブジェクト
x <- 1 #条件判定の基準となるオブジェクト
repeat{
 res <- res + x
   x <- x + 1
   if (x > 10) break
}
print(res)

今回repeatによる方法を初めて知ったのですが,これを使うといろいろな条件で繰り返し計算を終了できるので便利ですね。

Rのtable関数の出力表をもっと「表らしく」するには?

今回も,Rを利用したデータ解析の細かい話です。
Rで2つのカテゴリー変数のクロス集計表(それぞれの変数の値の組み合わせ度数を数えたもの)はtable関数簡単に求められます。

data <- data.frame(x = sample(1:5,100, replace = TRUE), y= sample(c("a","b","c"),100, replace = TRUE))
table(data)

f:id:jnobuyuki:20171214154045p:plain

簡単だけど,この出力はそれほど便利ではありません。罫線が引かれていないし,値をMSエクセルなどに転記して,表を作らなければ見た目があまりよくないと感じます。では,表としての見栄えを改善する方法はないでしょうか?

xtable関数はどうか?

xtableパッケージの中にあるxtable関数を使えば,表をtex形式やhtml形式で出力できます。

#xtableパッケージを未インストールならインストール
intall.packages("xtable")
#xtableパッケージの起動
library(xtable)

#tex形式で出力するなら
print(xtable(table(data)),type = "latex")

これで以下のような出力が得られます。
% latex table generated in R バージョン番号 by xtable バージョン番号 package
% 作成年月日
\begin{table}[ht]
\centering
\begin{tabular}{rrrr}
\hline
& a & b & c \\
\hline
1 & 7 & 9 & 8 \\
2 & 5 & 7 & 4 \\
3 & 8 & 6 & 7 \\
4 & 3 & 10 & 6 \\
5 & 9 & 8 & 3 \\
\hline
\end{tabular}
\end{table}

この出力はPCにtex環境がインストールされている必要があります。

print(xtable(table(data)),type = "html")

html形式で出力すると以下のようなタグ付きの出力が生成されます。はてなブログではhtmlなので表として表現されますね。

<!-- html table generated in R バージョン番号 by xtableバージョン番号 package -->
<!-- Thu Dec 14 15:47:29 2017 -->
<table border=1>
<tr> <th>  </th> <th> a </th> <th> b </th> <th> c </th>  </tr>
  <tr> <td align="right"> 1 </td> <td align="right">   7 </td> <td align="right">   9 </td> <td align="right">   8 </td> </tr>
  <tr> <td align="right"> 2 </td> <td align="right">   5 </td> <td align="right">   7 </td> <td align="right">   4 </td> </tr>
  <tr> <td align="right"> 3 </td> <td align="right">   8 </td> <td align="right">   6 </td> <td align="right">   7 </td> </tr>
  <tr> <td align="right"> 4 </td> <td align="right">   3 </td> <td align="right">  10 </td> <td align="right">   6 </td> </tr>
  <tr> <td align="right"> 5 </td> <td align="right">   9 </td> <td align="right">   8 </td> <td align="right">   3 </td> </tr>
   </table>

a b c
1 7 9 8
2 5 7 4
3 8 6 7
4 3 10 6
5 9 8 3


これなら表貼り付けもできそうですね。

番外編:やっぱりエクセルを利用する

クロス集計表の計算自体はRにやらせて,結果をエクセルで読み込めば良いかもしれません。その場合は,以下のようにwrite.table関数を利用すると便利です。

write.table(table(data),"filename.txt", quote = FALSE, sep = ",")

これでできたfilename.txtをエクセルで読み込んだら,あとは罫線を引いて,幅を整えてできあがりです。

番外編その2: RStudioならrmd形式でマークダウンの表を使う

.rmd形式では|と-をつかって表を作成できます。

||a|b|c|
|---|---|---|---|
|1|7|9|8|
|2|5|7|4|
|3|8|6|7|
|4|3|10|6|
|5|9|8|3|
a b c
1 7 9 8
2 5 7 4
3 8 6 7
4 3 10 6
5 9 8 3

Rのplot関数で作るグラフの軸とその値の色を変えたい

Rはグラフをプログラミングコードで簡単に作図できるという強みがあります。とりあえずplot関数を使えばグラフをつくれるものの,いろいろな目的に合ったグラフを作るには細かい調整が欠かせません。今回は,軸や軸の値の色を変える方法を紹介します。

引数fgとcol.axisの利用

まずはデフォルトのグラフとして以下のコードで作図したグラフを見てみましょう。

plot(0,0)

f:id:jnobuyuki:20171210114752j:plain

つぎにfgを足して,軸(というより囲み枠)の色を変えてみましょう。

plot(0,0, fg = "blue")

f:id:jnobuyuki:20171210114848j:plain

今後はcol.axis を足して軸の値の色を変えてみましょう。

plot(0,0, col.axis = "blue")

f:id:jnobuyuki:20171210114935j:plain

ちなみにcol.labという引数もあります。これを変更すると軸のラベルの色を変更できます。

f:id:jnobuyuki:20171210115049j:plain

Rのデータフレームから数値変数だけを抜き出したい

今回は,ありそうでなさそうなデータハンドリングに関して,メモ代わりにやり方を共有します。
Rを利用しながらデータ解析を行う際に,データフレームという数値変数も文字列変数も一緒に保存できる形式が便利です。便利なのを良いことに,順序をあまり考慮せずにデータフレームオブジェクトを作ってしまうと...。「20個ある変数の中で,2番めと4番目と5番目と9番目10番目11番目と18番目の変数が数値変数。あとは文字列変数。」といった複雑な状況が生じます。では,このような数値変数と文字列変数がまざったデータフレームオブジェクトから数値変数だけを抜き出す方法を考えてみましょう。

str関数はあまり役に立たない

str関数は,データフレームオブジェクトの中身の変数のクラスを表示してくれます。これを利用できそうな気がするのですが,どうもstr関数は,次の計算に使用可能な出力がありません。なので,結局目で見ながらメモをとることになってしまいます。

is.numeric関数を使いましょう

str関数がうまくいかないので,is.numeric関数を利用します。この関数は,引数として与えたベクトルオブジェクトが数値ベクトルのときにTRUE, そうでなければFALSEを返します。なので,次のようなコードで数値ベクトルかどうかの判断した結果を残せます。

res <- NULL

for  ( i in 1:ncol(data)){

    res <- append(res, is.numeric(data[,i]))    

}

あとは,データフレーム全体から,is.numeric関数の出力結果がTRUEの列番号の変数だけを抜けば良いでしょう。

subsetdata <- data[,which(res == TRUE)]


もっと簡単なやり方やそれを一度にできる関数をご存じの方がいらしたらぜひ教えてください。

R言語で複数のスペースで区切られたデータを読み込む

今回は本当にちょっとしたことですが、ハマる内容なので皆様と共有します。

read.table関数でテキストデータを読み込む

データ分析をするときに、何かのアプリケーションで作成したテキストデータをRに読み込ませることがあります。もっとも汎用的な関数はread.table関数です。この関数では、以下のようにファイル名、区切り文字、変数名ラベルの有無などを設定してRのデータフレーム型のオブジェクトとして読み込みます。

data <- read.table("ファイル名", sep = "", header = TRUE)

上記のうち、sepが区切り文字です。カンマ区切りなら","、タブ区切りなら"\t"にします。header はテキストファイルの1行目に変数名があるならTRUE、ないならFALSEにします。

複数のスペースで区切られたテキストファイルの読み込み

通常は上記のような操作でファイルを読み込めば良いので全く問題ありません。問題は、1つ以上の空白スペースで区切られたテキストファイルを読み込むときです。このようなファイルの場合、テキストファイルの見栄えをよくする都合で、変数間でスペースの数が異なることがしばしばあります。これをいかのような区切り文字にスペースを設定する方法だとうまくいきません。

data <- read.table("ファイル名", sep = " ", header = TRUE)

なぜうまくいかないかというと、上記の方法では区切り文字を「1文字の空白スペース」と指定しているからです。つまりスペースの数+1だけ変数があるとなってしまいます。

sep はデフォルトにすればよい

複数の空白スペースで区切られたファイルは、区切り文字をデフォルト""にするとうまく読み込めます。実は、区切り文字のデフォルトは1つまたは複数の空白スペースなんです。なので、空白スペースで区切られたテキストファイルを読み込むにはsepを設定しない(つまりデフォルト値を使う)または以下のように書けば良いでしょう。

data <- read.table("ファイル名", sep ="", header = TRUE)

R言語の場合、きめ細かく引数を設定するのが上手に使うコツの1つだと思うのですが、たまにはデフォルト値を信用してみるというのも大事なようです。

累積PVが30万を越えました。ありがとうございます。

タイトルの通り、累積のPVが30万を越えました。たくさんの方に検索していただいているのだと思うと、もっと良い記事をたくさん投稿しようと思います。そして、数は少ないのですが、常連で読んでくださる方、これからもどうぞよろしくお願いします。

Videoタグで埋め込まれた動画の再生スピードを変えたい

今回は、ウエブ上に置かれている動画の操作について、ちょっとしたやり方を書きます。自分自身へのメモ代わりです。

動画の再生

インターネット上の動画コンテンツは以前はFlashというプラグインを利用して閲覧することが多かったのですが、最近はvideoタグというHTML5のオブジェクトとして埋め込まれることが多くなりました。例えばYou Tubeの動画も多くはこのvideoタグとして埋め込まれているようです。そして、動画の内容によっては、少し早く再生したい、または遅く再生したいということがありますよね。 You Tubeには再生スピードをコントロールする機能が付いていますが、0.25倍、0.5倍、1.25倍、1.5倍、2倍といったように「あと少し早くまたはゆっくり」という変更ができません。今回紹介する方法は、任意の倍率で再生スピードを変えられます。

1. 再生したい動画を表示する

まずは再生したい動画を表示しましょう。

2. Consoleウインドウを開く

Chromeでしたら、右上のメニューから「その他のツール」→「デベロッパーツール」をクリックするとConsoleウインドウが開きます。

3. videoタグのplaybackRage属性を上書きする

以下のコードでvideoタグのオブジェクトの再生スピードを変更できます。以下の例では再生スピードを2倍にしています。2を任意の数字にかえることで、好きな再生速度に設定できます。

document.querySelector('video').playbackRate = 2;

これで動画の再生スピードを変えられます。

おまけ

ここまで紹介しておいてから、ここのおまけとして書くのは少しおかしいのですが、実は、このやり方がうまくいかないこともあります。私の場合mac版のChromeで一部のvideoタグに埋め込まれた動画について上記操作をしても何も変更できないことがあります。どうやら、document.querySelector('video')の段階で参照すべきオブジェクトが拾えていないようです。この対処法として、ビデオが再生されている画面を二本指クリック(右クリック)して、「検証」を押すと、上記と同様にデベロッパーツールが開きます。これをしてからだと、上記の操作が思った通りに動きました。うまくいかないという方はこちらも試してみてください。