« 2014年2月 | トップページ | 2014年4月 »

2014年3月31日 (月)

[R]文字列の英文字を大文字(小文字)に変換する

toupper関数かtolower関数を使う。小文字から大文字へはtoupper関数を、大文字から小文字はtolower関数を使う。

> s <- c("A", "bc", "dEF ", " 123 ")
> toupper(s)
[1] "A" "BC" "DEF " " 123 "
> tolower(s)
[1] "a" "bc" "def " " 123 "

2014年3月26日 (水)

[R]「以下にエラー type.convert(data[[i]], as.is = as.is[i], dec = dec, na.strings = character(0L)) : 」

read.xls関数を使うと以下のエラーメッセージが出てExcelのファイルが読み込めないときがある。

> read.xls("data.xls", header = F)
以下にエラー type.convert(data[[i]], as.is = as.is[i], dec = dec, na.strings = character(0L)) :
   ○○ に不正なマルチバイト文字があります

フィールドに全角文字(日本語)が含まれていて、フィールドのデータの種類の推定に失敗している。フィールドがすべて文字列として読み込めば、このエラーを回避できる。

> read.xls("data.xls", colClasses = "character", header = F)

なお、上記の例では、ヘッダーがないものとして読み込んでいる。

2014年3月25日 (火)

[R]「以下にエラー make.names(col.names, unique = TRUE) : 」

read.xls関数を使うと以下のエラーメッセージが出てExcelのファイルが読み込めないときがある。

> read.xls("data.xls")
以下にエラー make.names(col.names, unique = TRUE) :
   ○○ は不正なマルチバイト文字です

read.xls関数は初期状態では1行目にヘッダーがあるとして読み込もうとする。その1行目にマルチバイト文字(全角文字、日本語)が含まれておりうまくいっていない。read.xls関数はマルチバイト文字の処理が得意ではないようなので、1行目をヘッダーとしない(つまり、データが1行目からある)として読み込ませればよい。

> read.xls("data.xls", header = F)

2014年3月23日 (日)

[R]エクセル(Excel)のファイルからデータを読み込む

以前のエクセルのファイルであるExcel97-Excel2003ブック形式(Excel 97-Excel2003バイナリファイル形式(BIFF8)、*.xls)の中身を、データフレーム形式で簡単に読み込むことができる。

read.xls関数を使えばよい。ただし、gdataパッケージを読み込んでおく必要がある。

初めにgdataパッケージをインストールする。

> install.packages("gdata")
Installing package into ‘○○’
(as ‘lib’ is unspecified)
also installing the dependency ‘gtools’
(表示省略)
パッケージ ‘gtools’ は無事に展開され、MD5 サムもチェックされました
パッケージ ‘gdata’ は無事に展開され、MD5 サムもチェックされまし
(表示省略)

使ってみる。なお、使用前にはlibrary関数でgdataパッケージを読み込む(インストールしただけではダメ)。

> dtf <- read.xls("data.xls")
エラー:  関数 "read.xls" を見つけることができませんでした
> library(gdata)
(省略)
> dtf <- read.xls("data.xls")

2014年3月22日 (土)

[R]「以下にエラー findPerl(verbose = verbose) : 」

read.xls関数を使うと以下のエラーメッセージが出てExcelのファイルが読み込めないときがある。

> read.xls("data.xls")
以下にエラー findPerl(verbose = verbose) :
  perl executable not found. Use perl= argument to specify the correct path.
以下にエラー file.exists(tfn) :  'file' 引数が不正です

これは、Perlが使えない事による。Perlをインストールして使える状態にしておけばよい。

著名なフリーウェアであるActivePerlは以下のところからダウンロードできる。

http://www.activestate.com/activeperl

このページの下部には、「Community Edition」、「Business Edition」、「Enterprise Edition」と3つあるが、一番左の「Community Edition」であれば無料で使える。ダウンロード用のページhttp://www.activestate.com/activeperl/downloadsから自分の環境にあったものを選べばよい。

選んだ後に、プラットフォーム(Windowsとか)や名前などを記入するフォームが表示されるが、特に入力しなくてもよい。

このActivePerlをインストールして使える状態であれば、上記のエラーメッセージは表示されなくなる。

2014年3月20日 (木)

[R]周期変位を含むデータの回帰モデルを作成する

線形回帰であれば関数lmを使用すれば簡単にできる。以下の式で表される周期変動を含む回帰モデルを作成してみた例を示す。

y = a + b×x + c sin(2πx) + d cos(2πx)

a,b,c,d:定数

この例では周期変動の周期は1としている。以下に、回帰モデルの作成例を示す。

> # 独立変数(横軸方向)のデータを作成(特に意味はないが不等間隔)
> x <- c(0.0, 0.1, 0.5, 0.7, 1.0, 1.2, 1.4, 1.9, 2.0)
> # 従属変数(縦軸方向)のデータを適当に作成
> y <- c(0.1, 1.2, -0.4, -0.5, 0.0, 1.4, 0.4, 0.2, 1.5)
> # 関数lmを使用して回帰モデルを作成する
> r <- lm(y ~ x + sin(2 * pi * x) + cos(2 * pi * x))
> # 作成した回帰モデルを描画するために、描画のための横軸方向のデータを作成
> xest <- seq(0, 2, 0.05)
> # 描画のために作成した独立変数に基づく従属変数の値を作成
> yest <- predict(r, data.frame(x = xest))
> # 独立変数と従属変数のプロット
> plot(x,y)
> # 回帰モデルの描画
> lines(xest, yest)
> # 最後に作成した回帰モデルのモデルパラメーターを描画
> coef(r)
    (Intercept)               x sin(2 * pi * x) cos(2 * pi * x)
     -0.1074583       0.3660297       0.8998182       0.3977064
> # 切片
> coef(r)[1]
(Intercept)
-0.1074583
> # 三角関数の合成により、求めた式の振幅を計算する
> sqrt(coef(r)[3] ^ 2 + coef(r)[4] ^ 2)
sin(2 * pi * x)
      0.9837902

関数coefにより表示された値が、左から順にそれぞれa、b、c、dの値である。

sinとcosにそれぞれ「2 * pi * x」としたところがポイント。これは関数sinも関数cosも引数はラジアン単位で与えなければならないことから、xの値に2πをかけることで周期を1とした値に変換している。

2014年3月18日 (火)

[R]「下にエラー file(file, "rt") : 'description' 引数が不正です」

read.table関数などのファイルを読み込ませる関数の引数に、長さ(要素数)が複数あるベクトルを指定したときにこのエラーメッセージが出る。以下は、カレントディレクトリにa.datとb.datというデータファイルがある場合の例。

> v <- c("a.dat", "b.dat")  # データファイル名のベクトルを作成
> read.table(v)  # 誤ってベクトルそのものをファイルとして指定
以下にエラー file(file, "rt") :  'description' 引数が不正です
> read.table(v[1])  # こうやって1要素ずつ指定することしかできない
(表示省略)

ちなみに、scan関数では以下のようなエラーメッセージが表示される

> scan(v)
以下にエラー file(file, "r") :  'description' 引数が不正です
追加情報:  警告メッセージ:
In if (file == "") file <- stdin() else { :
   条件が長さが 2 以上なので、最初の 1 つだけが使われます

[R]文字列を置換する

文字列を置換するにはsub関数かgsub関数を使用する。正規表現を使うこともできる。置換する文字列はベクトルの要素ごとに行うことも可能。

> str <- "123456123456"  # 文字列を作成
> sub("123", "ABC", str)  # sub関数は最初にマッチしたものだけ置換
[1] "ABC456123456"
> gsub("123", "ABC", str)  # gsub関数はマッチするものすべて置換
[1] "ABC456ABC456"
> sub("[4-6]", "XYZ", str)  # 正規表現も使える
[1] "123XYZ56123456"
> gsub("456$", "XYZ", str)  # gsub関数も同じく
[1] "123456123XYZ"
> str <- c("ABC", "DEF")  # 複数の要素も置換できるか実験
> gsub(".$", "Z", str)
[1] "ABZ" "DEZ"

2014年3月17日 (月)

[R]フォルダー(ディレクトリ)にあるファイルの一覧を得る

dir関数を使えばよい。戻り値は文字列のベクトル。以下はフォルダーC:\Windows\Fontsにある拡張子がttcのファイルをベクトルで得る例。

> v <- dir(path = "C:/Windows/Fonts", pattern = "\\.ttc$")
> v
(表示省略)

指定したファイルが見つからない場合は、長さが0のベクトルが戻り値となる。NULLが返ってくるわけではないので注意。

> v <- dir(path = "C:/Windows/Fonts", pattern = "*.xyz")
> is.vector(v)
[1] TRUE
> is.null(v)
[1] FALSE
> mode(v)
[1] "character"
> class(v)
[1] "character"
> length(v)
[1] 0

2014年3月16日 (日)

[R]scan関数を使用すると「Read N items」と画面に表示されてしまう

scan関数をオプションを特に指定しないで使用すると、「Read N items」と画面に表示されてしまう。これは、quietオプションに論理値のT(TRUE、True)を指定すると表示されなくなる。以下はカレントフォルダーにdata.datというファイルがある場合の例。

> scan("data.dat")
Read 3 items
[1] 1 2 3
> scan("data.dat", quiet = T)
[1] 1 2 3
> v <- scan("data.dat")
Read 3 items
> v <- scan("data.dat", quiet = T)
>

quietオプションは初期状態ではFになっているため、特に指定をしないと「Read N items」と表示されてしまう。

2014年3月14日 (金)

[R]Rでプログラミング

RでFortranやVisual C++のようなプログラミングは可能。非常に簡単な例として、画面に「Hello.」と表示するプログラム(スクリプト)を作成してみる。

メモ帳(他のテキストエディタでも可)を起動し、以下の1行を入力してprogram.Rとして保存する。

cat(sprintf("Hello.\n"))

Rを起動し、program.Rを保存したフォルダーに移動する(ここではC:\Workとした例)。

> setwd("C:/Work")

作成したプログラム(program.Rのこと)を実行する。実行するにはsource関数を使う。

> source("program.R")
Hello.

これでプログラムが実行された。本プログラムは画面に「Hello.」と表示するだけのプログラムなので、表示されてプログラムは自動で終了している。

Rはプログラミング言語として条件分岐や繰り返しの構文を十分備えていることから、いわゆるプログラミング言語としての機能は十分有しており、例えば100行や1000行を越えるようなプログラムの作成も十分可能である。

2014年3月13日 (木)

[R]データフレームの各列のモードやクラスを得る

sapply関数を使用すると簡単に得ることができる。sapply関数を使用することで、すべての列について調べることができて結果をベクトルで得ることができる。

> v1 <- c(1, 2, 3)
> v2 <- c("A", "B", "C")
> df <- data.frame(v1, v2)
> mod <- sapply(df, mode)
> cls <- sapply(df, class)
> is.vector(mod)
[1] TRUE
> is.vector(cls)
[1] TRUE
> mod
       v1        v2
"numeric" "numeric"
> cls
       v1        v2
"numeric"  "factor"

2014年3月12日 (水)

[R]図をEPSファイルで出力する

dev.copy2eps関数を使用すればよい。plot関数などで図を画面に表示された状態で、例えば以下のようにすればよい。以下の例では画面に表示されているグラフをカレントディレクトリに「figure.eps」というファイルでEPS形式で出力する。

dev.copy2eps(file = "figure.eps", family = "Japan1")

familyオプションはフォントの指定。とりあえず「"Japan1"」と指定しておけば日本語の文字化けの心配はない。

2014年3月 8日 (土)

[R]クラスについて

Rのすべてのオブジェクトはクラスを持つ。クラスとはそのオブジェクトの抽象的な型のこと。

各オブジェクトのクラスを調べるにはclass関数を使う。

モードとクラスは違う。例えば、日付型ベクトル(オブジェクト)は数値のモードを持つが、その数値を解釈する方法(クラス)はDateであり、Dateクラスを持つ。

> class(1.2)
[1] "numeric"
> class("A")
[1] "character"
> class(as.Date("2014-01-01"))
[1] "Date"
> mode(as.Date("2014-01-01"))
[1] "numeric"

2014年3月 7日 (金)

[R]モードについて

Rのすべてのオブジェクトはモードを持つ。モードとはメモリへの格納方法を示した物理的な型のこと。

各オブジェクトのモードを調べるにはmode関数を使う。

> mode(1.2)
[1] "numeric"
> mode("A")
[1] "character"
> mode(as.Date("2013-12-31"))
[1] "numeric"

Dateオブジェクトのモードはnumericであることに注意。

« 2014年2月 | トップページ | 2014年4月 »

無料ブログはココログ

■■

■■■