R(ファイル・ディレクトリ)

2022年12月14日 (水)

[R]文字コードを指定してCSVファイルを読み込む

read.csv関数を使う。その際、fileEncodingオプションに文字コードを指定する。シフトJIS(CP932)であれば「CP932」を、UTF-8であれば「UTF-8」を指定する。特に指定をしないと、今の環境のロケールの文字コードで読み込む。指定に誤りがあると、エラーが発生する。

以下は、以下のテキストをそれぞれシフトJIS(CP932)でtextcp932.csv、UTF-8でtextutf8.csvと保存をして、それぞれ読み込ませた例。

no,姓,名
1,中野,一花
2,中野,二乃

実行結果。

> Sys.getlocale()
[1] "LC_COLLATE=Japanese_Japan.932;LC_CTYPE=Japanese_Japan.932;LC_MONETARY=Japanese_Japan.932;LC_NUMERIC=C;LC_TIME=Japanese_Japan.932"
> dtf <- read.csv("textcp932.csv")
> print(dtf)
no 姓 名
1 1 中野 一花
2 2 中野 二乃
> dtf <- read.csv("textcp932.csv", fileEncoding = "CP932")
> print(dtf)
no 姓 名
1 1 中野 一花
2 2 中野 二乃
> dtf <- read.csv("textutf8.csv")
make.names(col.names, unique = TRUE) でエラー:
2 は不正なマルチバイト文字です
> dtf <- read.csv("textcp932.csv", fileEncoding = "CP932")
> print(dtf)
no 姓 名
1 1 中野 一花
2 2 中野 二乃

2022年12月 3日 (土)

[R]新常用漢字表の漢字を含むテキストファイルを読み込む

Windows版Rのバージョン4.1.3までは、新常用漢字表の漢字のうちUnicodeにしか存在しない文字、すなわちシフトJISコードが割り当てられていない漢字を含むテキストファイルを読み込むことはエンコードを指定してもできなかった。例えば、以下の内容をテキストファイルmoji.txtとしてUTF-8で保存する。

ABC
123
あいう
補塡する
𠮟る
辰𠮷𠀋一郎
𩸽(ホッケ)を食べる
𩹉(トビウオ)を捕まえる

バージョン4.1.3で文字コードにUTF-8を指定してscan関数で読み込むと失敗する。

> s <- scan(file = "moji.txt", what = character(), sep = "\n", fileEncoding = "UTF-8")
Read 4 items
警告メッセージ:
scan(file = "moji.txt", what = character(), sep = "\n", fileEncoding = "UTF-8") で:
入力コネクション 'moji.txt' に不正な入力がありました
> print(s)
[1] "ABC" "123" "あいう" "補"

バージョン4.2.2で文字コードにUTF-8を指定してscan関数で読み込むとうまくいく。

> s <- scan(file = "moji.txt", what = character(), sep = "\n", fileEncoding = "UTF-8")
Read 8 items
> print(s)
[1] "ABC" "123"
[3] "あいう" "補塡する"
[5] "頰をなでる" "辰𠮷𠀋一郎"
[7] "𩸽(ホッケ)を食べる" "𩹉(トビウオ)を捕まえる"

サロゲートペアの文字(6~8行目)も、正しく読み込んでいることがわかる。

2022年8月22日 (月)

[R]カレントディレクトリを設定する

getwd関数を使う。

> getwd()
[1] "C:/Users/○○/Documents"
> setwd("C:/Users/○○/Pictures/")
> getwd()
[1] "C:/Users/○○/Pictures"
> setwd("C:/Users/○○/Picture/")
setwd("C:/Users/○○/Picture/") でエラー:
作業ディレクトリを変更できません

最後の例のとおり、存在しないディレクトリを指定するとエラーが発生する。

2022年8月20日 (土)

[R]カレントディレクトリを取得する

getwd関数を使う。インストール直後のスタートメニューからRを起動した状態で実行してみる。

> getwd()
[1] "C:/Users/○○/Documents"

○○にはアカウント名が入る。

これはスタートメニューからRを起動するとそのようになっただけであり、例えば既存の.RDataファイルをダブルクリックしてRを起動すれば、その.RDataを置いてあるディレクトリをカレントディレクトリとしてRは起動することになる。

2022年7月29日 (金)

[R]ベクトルの中身をテキストファイルに書き込む

write関数を使う。次のベクトルの中身をテキストファイル「output.txt」に書き込む

> s <- c("a", "AB", "あいう", "", "阿伊宇")
> write(s, file = "output.txt")

カレントディレクトリにファイル「output.txt」がつくられ、一要素一行の以下のような中身になっているはず。同名ファイルが既にある場合は、そのファイルはいったん削除され、新たにファイルがつくられる。

a
AB
あいう

阿伊宇

既にある同名ファイルに追加したい場合は、appendオプションをTRUEにする。

> write(s, file = "output.txt", append = TRUE)

ファイルoutput.txtの中身は以下のようなったはず。

a
AB
あいう
阿伊宇
a
AB
あいう
阿伊宇

これまでは文字列型ベクトルを出力していたが、数値型ベクトルの場合は次のように書き込まれる。

> n <- 1:3
> write(n, file = "output.txt")
1 2 3

要素と要素の間のセパレーターはデフォルトでは空白一つ(0x20)。これを変えるにはsepオプションにセパレーターを指定する。

> write(n, file = "output.txt", sep = "\n")
1
2
3

2022年7月28日 (木)

[R]テキストファイルの中身を簡単に読み込む

scan関数を使うとテキストファイルの中身をベクトルに簡単に読み込むことができる。以下の6行からなるテキストファイルを「text.txt」として保存する。

A
abc
あいう
阿伊宇

123xyz

読み込んでみる。

> lines <- scan("text.txt", what = character(0))
Read 5 items
> print(lines)
[1] "A" "abc" "あいう" "阿伊宇" "123xyz"

whatオプションをcharacter(0)とすることで、すべてを文字列で読み込む。デフォルトでは一行一要素でベクトルに代入される。空行(5行目)はデフォルトでは読み込まれない。これを読み込むようにするには、blank.lines.skipオプションをFALSEにする。

> lines <- scan("text.txt", what = character(0), blank.lines.skip = FALSE)
Read 6 items
> print(lines)
[1] "A" "abc" "あいう" "阿伊宇" "" "123xyz"

「Read 6 items」を表示しなくするには、quietオプションをTRUEにする。

> lines <- scan("text.txt", what = character(0), quiet = TRUE)
> print(lines)
[1] "A" "abc" "あいう" "阿伊宇" "123xyz"

2022年5月 3日 (火)

[R]ファイル、フォルダー(ディレクトリ)の存在を確認する

ファイルの存在の有無を確認するにはfile.exists関数を、フォルダーの場合はdir.exists関数を使う。Rはフォルダー(ディレクトリ)の区切りを示す記号に「¥」(円マーク)と「/」(スラッシュ)の両方を使うことができる。

> file.exists("C:/Windows/win.ini")
[1] TRUE
> file.exists("C:/Windows/win.inii")
[1] FALSE
> dir.exists("C:/Windows")
[1] TRUE
> dir.exists("C:/Windowss")
[1] FALSE

file.exists関数は、フォルダーを指定した場合、そのフォルダー名の最後に区切り記号を付けないとTRUEを返すので注意。

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

dir.exists関数はファイルであればFALSE、フォルダーであればTRUEを返す。

> dir.exists("C:/Windows")
[1] TRUE
> dir.exists("C:/Windows/")
[1] TRUE
> dir.exists("C:/Windows/win.ini")
[1] FALSE

2021年9月12日 (日)

[R]テンポラリファイルを利用する

一時的なファイル(テンポラリファイル)を利用するにはtempfile関数を使う。tempfile関数はテンポラリファイルを作成するのではなく、テンポラリファイルとして使用できるファイル名を返すことに注意。以下、実行例。

> filename <- tempfile()
> filename
[1] "C:\\Users\\○○\\AppData\\Local\\Temp\\××\\□□"
> write(1:3, file = filename)
> dtf <- read.table(file = filename)
> dtf
V1 V2 V3
1 1 2 3

上記はWindows 10 で実行した例。○○はアカウント名、××と□□は任意の文字列。××は現在起動したR専用のテンポラリディレクトリであり、そのRを終了するとこのディレクトリは自動で削除される。□□はテンポラリファイルのファイル名で、このファイルも自動で削除される。

このテンポラリディレクトリ名を得るにはtempdir関数を使う。

> tempdir()
[1] "C:\\Users\\○○\\AppData\\Local\\Temp\\××"

2014年1月20日 (月)

[R]read.table関数でテキストファイルを読み込むときに数字を文字として読み込む

例えば以下のようなテキストファイル data.dat を、

001 002
003 004

read.table関数でオプションを何も付けずに読み込むと、数値として読み込まれてしまう。

> df <- read.table("data.dat")
> df
  V1 V2
1  1  2
2  3  4

「001」や「002」を文字として読み込ませたいときは、colClassesオプションを使って文字型であることを明示すると、文字として読み込むことができる。

> df <- read.table("data.dat", colClasses = "character")
> df
   V1  V2
1 001 002
2 003 004
無料ブログはココログ