« 2014年3月 | トップページ | 2014年5月 »

2014年4月28日 (月)

[R]グラフのスケール数字を横軸縦軸それぞれ別々に軸から離して配置する

グラフのスケール数字と軸との間の距離は、par関数のmgpオプションを使えば変えられる。これは横軸縦軸共に共通の設定になっており、例えば、縦軸のスケール数字を磁区と垂直方向に配置させる(las = 2)と、横軸と縦軸で、スケール数字と磁区線の間が微妙に異なり、バランスが悪い。これを調整するには、多少面倒だがaxis関数を使用してスケール数字を書き、横軸縦軸それぞれ書く直前にpar関数のmgpオプションで数値を設定する。

> x <- c(1, 2, 3)
> y <- c(1, 4, 9)
> plot(x, y, xaxt = "n", yaxt = "n")
> par(mgp = c(3, 0.2, 0))
> axis(1, 1:10, tck = 0.01)
> axis(2, 1:10, tck = 0.01, las = 2)

例えばこのようにすると、縦軸のスケール数字は軸線に寄るが、横軸のスケール数字は軸線から少し離れていてバランスが悪い。そこで以下のように、axis関数を横軸、縦軸それぞれ描画する前に設定をする。

> x <- c(1, 2, 3)
> y <- c(1, 4, 9)
> plot(x, y, xaxt = "n", yaxt = "n")
> par(mgp = c(3, 0.2, 0))
> axis(1, 1:10, tck = 0.01)
> par(mgp = c(3, 0.5, 0))
> axis(2, 1:10, tck = 0.01, las = 2)

これで、横軸と縦軸のスケール数字がそれぞれ軸線から同じくらい離れて描画される。

2014年4月17日 (木)

[gcc]「`pow' に対する定義されていない参照です」

math.hをincludeして数学関係の関数を使用したプログラムをコンパイルした時に、以下のようなエラーメッセージが表示されることがある。

$ gcc -o ○○ ○○.c
/tmp/××.o: 関数 `××' 内:
○○.c:(.text+△△): `pow' に対する定義されていない参照です
○○.c:(.text+△△): `sqrt' に対する定義されていない参照です
○○.c:(.text+△△): `sin' に対する定義されていない参照です
○○.c:(.text+△△): `cos' に対する定義されていない参照です
○○.c:(.text+△△): `atan' に対する定義されていない参照です

これは、math.hに含まれる数学関係の関数を使用する時は、コンパイル時にオプション-lmを付けないと、必要なライブラリがリンクされないからである。

実行ファイルを作成するためには、オプション-lmを付けてコンパイルをすること。

$ gcc -o ○○ ○○.c -lm

ふつうのLinuxプログラミング 第2版 Linuxの仕組みから学べるgccプログラミングの王道 GNU Make 第3版 明快入門 C (林晴比古実用マスターシリーズ) Introduction To Gcc Gcc 7.0 Gnu Openmp Intel Visual Fortran リファレンスガイド C/C++、FortranプログラマーのためのインテルParallel Stud―Windows、LinuxおよびMac OS 10

2014年4月13日 (日)

[Excel VBA]変数を宣言しなければ変数を使えないようにする(変数の宣言を強制にする)

Excel VBAは初期状態では変数を宣言しなくても使うことができる。これは、間違いなくバグの温床になることから、変数は宣言しないと使えないようにしてしまおう。以下の1行をモジュールの先頭に書く。

Option Explicit

この1行を書くことで、dimコマンドで宣言をしない変数は使えなくなる。

2014年4月12日 (土)

[R]空の日付ベクトルを作成する

計算する前に空のベクトルを用意するため、as関数とNULL値を使用して空のベクトルを作成することがあるが、日付型ベクトルはas.Date関数にNULL値を与えただけではうまく作れない。空の日付ベクトルを作るときは、as.Date関数とas.character関数を組み合わせると作ることができる。

> d <- as.numeric(NULL)  # 空の数値ベクトルを作る
> c(d, 1)  # 空なので1つ追加すると長さが1のベクトルになる
[1] 1
> dte <- as.Date(NULL)  # 空の日付ベクトルを作ってみるが失敗
以下にエラー as.Date.default(NULL) :
   'NULL' からクラス “Date” へ変換は定義されていません
> dte <- NULL  # NULLベクトルを作ってみる
> dte <- c(dte, as.Date("2014-1-1"))  # 日付を1つ追加
> dte  # 結果を表示、数値ベクトルになっている
[1] 16071
> class(dte)  # (同上)
[1] "numeric"
> dte <- as.Date(as.character(NULL))  # 空の日付ベクトルを作る
> class(dte)
[1] "Date"
> dte <- c(dte, as.Date("2014-1-1"))  # 日付を1つ追加してみる
> dte  # ベクトルは日付型であることを確認
[1] "2014-01-01"
> class(dte)  # (同上)
[1] "Date"

2014年4月11日 (金)

[R]コードのエラーを抑制もしくは判定する

Rのスクリプトは、コードの実行時にエラーが発生するとスクリプトが中断する(例えばread.table関数で中身が空のファイルを読み込んだ時など)。

try関数を使うとこのエラーの発生有無の判定とスクリプトの中断を抑制することができる。

エラーが発生する可能性があるコードをtry関数内に書き、そのtry関数の戻り値を得られるようにしておく。エラーが発生したときにはスクリプトは中断しない。try関数に含めたコードがエラーを発生したか否かの判定は、try関数の戻り値を見ればよい。エラー発生時は「try-error」という文字列になるので、それで判定するようにしておけばよい。

> a  # aというベクトルがない場合
エラー:  オブジェクト 'a' がありません
> 1:3
[1] 1 2 3
> 1:a  # aというベクトルがないのでエラーが発生する
エラー:  オブジェクト 'a' がありません
> r <- try(1:3, silent = T)
> class(r)  # エラーが発生せずに数値ベクトルが作成されている
[1] "integer"
> r
[1] 1 2 3
> r <- try(1:a, silent = T)  # 上ではエラーが発生してシステムが中断したが、ここでは中断しない
> class(r)
[1] "try-error"
> mode(r)
[1] "character"
> is.character(class(r))
[1] TRUE
> class(r) == "try-error"
[1] TRUE

[R]コードを文字列で与えて実行させる

eval関数とparse関数を組み合わせると行うことができる。

> 1:5
[1] 1 2 3 4 5
> eval(parse(text = "1:5"))
[1] 1 2 3 4 5
> str <- "1:5"
> eval(parse(text = str))
[1] 1 2 3 4 5
> a <- 1:6
> str <- "a <- 1:6"
> eval(parse(text = str))
> a
[1] 1 2 3 4 5 6

2014年4月10日 (木)

[R]ファイル(フォルダー)の存在を確認する

file.exists関数を使う。なお、3番目の例のとおり、ファイルでもフォルダーでもどちらの存在も確認することができる。

4番目の例のとおり、引数の文字列の最後に「/」(スラッシュ)を付けると、それがフォルダーを指定したことを明示することになる。3番目の例のとおりその逆は残念ながらできない(フォルダーの存在を確認することはできるが、フォルダーではないファイルの存在の確認はできない)。

> file.exists("C:/Windows/notepad.exe")
[1] TRUE
> file.exists("C:/Windows/notepadpad.exe")
[1] FALSE
> file.exists("C:/Windows")
[1] TRUE
> file.exists("C:/Windows/notepad.exe/")
[1] FALSE

[R]フォルダーのファイル一覧を得る

dir関数を使えばよい。以下はフォルダーworkにあるファイルとフォルダー一覧を得た例。

> dir("/work")
[1] "dir1"      "dir2"      "text1.txt" "text2.txt" "word.docx"

ファイルとフォルダーを簡単に分別する方法はないようだ。patternオプションに文字列を指定すると、その文字がファイル名(フォルダー名)に含まれるもののみ抽出する。

> dir(pattern = "2", "/work")
[1] "dir2"      "text2.txt"

(最後の)拡張子が「.txt」のもののみを得る。

> dir(pattern = "\\.txt$", "/work")
[1] "text1.txt" "text2.txt"

patternオプションは正規表現が適用されてしまうので注意。たとえばピリオド(.)は任意の一文字を指定することになってしまうので、ここで「.txt」とすると、「任意の1文字」+「txt」となってしまう。つまり拡張子が「.ttxt」のファイルも含まれてしまう。記号「$」はそれが文字列の最後という意味。「\\.txt」と指定をしただけでは例えば「a.txt.docx」というファイルも合致することになるので注意。

2014年4月 8日 (火)

[R]ベクトルからインデックス(添字)で指定をして要素を除外する

ベクトルから要素を取り出すときに、インデックス(添字)にベクトルで数値を指定することで特定の要素を取り出すことができる。逆にベクトルから特定の要素を取り除きたいことがある。そのようなときは、インデックスに負の数値型ベクトルを指定すればよい。ベクトルで負のインデックス番号を指定すると、その正のインデックス番号以外の要素から構成されるベクトルを取り出すことができる。

> a <- c("A", "B", "C")
> a[c(1, 3)]  # 1番目と3番目の要素だけ取り出す
[1] "A" "C"
> a[c(-2)]  # 2番目の要素だけ取り除く
[1] "A" "C"

[R]ベクトルからインデックス(添字)で指定をして要素をとりだす

ベクトルから特定の要素だけを取り出したい場合の話。その特定の要素を指定するのにインデックス(1から始まる要素を指す連番)で指定したいときは、ベクトルの添字に数値型ベクトルを指定すればよい。

> a <- c("A", "B", "C")
> a[c(1)]  # 1番目の要素だけ取り出す
[1] "A"
> a[c(1, 3)]  # 1番目と3番目の要素を取り出す
[1] "A" "C"
> a[1:2]  # ベクトルで指定すれば何でもよい
[1] "A" "B"

[Java]Ubuntu 13.10でJavaを使って数値計算を行う

Javaの開発環境は、パッケージdefault-jdkをインストールすればよい。

$ sudo apt-get install default-jdk

コンパイラがインストールされたかどうかの確認。

$ javac -version
javac 1.7.0_51

2014年4月 5日 (土)

[R]文字列を任意の文字(文字列)を区切りとして分割する

strsplit関数を使う。この関数は正規表現が使うことができる。以下は、文字列を1つ以上の空白で分割する例。正規表現で「[ ]+」とすることで、1つ以上の空白(半角スペース)という意味になる。なお、この関数は戻り値がリストなので注意。unlist関数を使うことでリストをベクトルにすることができる。

> str <- "A BC  DEFG"  # 文字列を設定
> strsplit(str, " ")  # strsplit関数の戻り値はリスト
[[1]]
[1] "A"    "BC"   ""     "DEFG"
> unlist(strsplit(str, " "))  # 空白1つで分割、unlist関数を使うことでベクトル化
[1] "A"    "BC"   ""     "DEFG"
> unlist(strsplit(str, "[ ]+"))  # 1つ以上の空白で分割
[1] "A"    "BC"   "DEFG"

2014年4月 4日 (金)

[ggplot2]点を描画する

geom_point関数を使う。

> library(ggplot2)
> xd <- c(1, 2, 3, 4, 6)
> yd <- c(1, 4, 9, 16, 36)
> df <- data.frame(xd, yd)
> g <- ggplot(df, aes(x = xd, y = yd)) + geom_point()
> plot(g)

2014年4月 1日 (火)

[Excel]標準偏差を求める関数

stdev関数、stdev.p関数、stdev.s関数を使えばよい。いずれもいわゆる標準偏差が求まる関数。

まず、stdev関数は古いバージョンのエクセルとの互換性のために用意されている関数であり、現在は極力しないほうがよい。

stdev.s関数(とstdev関数)は不偏分散の平方根。つまり、偏差平方和をn-1で割った値の平方根。

stdev.p関数は分散の平方根、つまり、偏差平方和をnで割った値。

=stdev(1,2,3,4,5,6,7,8,9)

2.738613…

=stdev.s(1,2,3,4,5,6,7,8,9)

2.738613…

=stdev.p(1,2,3,4,5,6,7,8,9)

2.581989…

« 2014年3月 | トップページ | 2014年5月 »

無料ブログはココログ

■■

■■■