「R」カテゴリーアーカイブ

R 指数表示回避でoptions(scipen )は大丈夫か?

Rを使っていて、大きな数字が指数表示になってしまうことを避けたいということがあります。

今回遭遇したのは、13桁の整数値です。

実際に試したのは、9223372036854775807(19桁)の数字。

符号付き64ビット整数の最大値です。

結果はこんな感じです。

1の位が変ってしまっています。

試しに、scipen=1000とかにしてみました。

やっぱり駄目でした(^^ゞ

一けた削ってみたら。

おいおい(一一”)

ということで限界を確認することにしました。

2の53乗〜54乗の間に限界がありそうです。

2の53乗が限界なのかな?
double 64ビットで表現できる数値の限界は、

±5.0e−324 から ±1.7e308
ですが、有効桁数は15〜16桁となっています。

そこから類推すると、内部で64ビットのdoubleで数値を持っているからなのかも知れませんね。

ということで、options(scipen = ???)はとても大きな数字を扱う時には注意した方が良さそうです。

 

 

Rをインストールする

Rのインストール方法を記録していなかったので、今更ながら記録します。

まず、Rをダウンロードします。
以下のサイトを開きます。

https://cran.r-project.org/

「Download R for Windows」→「base」もしくは「install R for the first time.」→「Download R 3.3.1 for Windows (70 megabytes, 32/64 bit)」をクリックするとダウンロードが開始されます。
最新版もこの順番でクリックすると、見つかるはずです。

今回ダウンロードしたファイルは、

R-3.3.1-win.exe

でした。

実行します。

 

最初に言語を選ぶ画面が表示されます。
別に困ることも無いので、日本語でインストールしてしまいます。

ここは迷わず「次へ」ですね。

こちらも気にせず。。。。しっかり読んでおきましょう(^^;
読み終えたら、「次へ」。

デフォルトのインストールフォルダーで良いでしょうから、そのまま「次へ」。

ここでも、変更の必要はありません。
32Bit版と64Bit版の片方で良いと思う方は、必要に応じて選択肢を変更してください。(正直、64Bit版だけでよいと思っています。)

熟練した方はここのサイトを見ているはずがありませんから、ここを見ている方はデフォルトのまま「次へ」ですねw

素人は迷わず「次へ」。

こちらも、迷うことなく「次へ」。

いきなり始まります!

インストールが終了しました。
「完了」をクリックして終了します。

デスクトップにアイコンが作られていると思います。

「R x64 3.3.1」というアイコンをダブルクリックして起動します。

こんな画面が出てきたら、正常にインストールされています。
ちなみに、こちらはRGuiの画面になります

Rはスクリプト言語です。ここで記述した内容がインタプリタで動作します。
記述した内容を、ファイルに保存してRScriptコマンドでファイルを指定して実行することも可能です。

ここではインストールまでです。

R データフレームの中身に直接アクセス?分解?

タイトルは非常に悩みました。なんと書けばパッと見てわかるか?と思ったのですが、無理ですね。

データフレーム(data.frame)の列要素を直接指定してアクセスする方法について記述します。

# data.frameを作成します。

> tx <- c(1,2,3,4,5,6,7,8,9)
> ty <- c(9,8,7,5,6,2,4,1,3)
> df <- data.frame(X=tx,Y=ty)
> df
X Y
1 1 9
2 2 8
3 3 7
4 4 5
5 5 6
6 6 2
7 7 4
8 8 1
9 9 3

#通常だと、この様に「データフレイム名$配列名」でアクセスします。
> df$X
[1] 1 2 3 4 5 6 7 8 9
> df$Y
[1] 9 8 7 5 6 2 4 1 3

# たくさん使うときは不便なので、attachをします。
> attach(df)

#要素に直接アクセスできます。
> X
[1] 1 2 3 4 5 6 7 8 9
> Y
[1] 9 8 7 5 6 2 4 1 3

#最後には開放するには

>detach(df)

以上

R data.tableで任意の列を抽出したい(名前で)

お恥ずかしいですが、Rでまたもや嵌った。

dd

—   X     Y   Z
1:123  456  555
2:345  443 666

こんなデータテーブルを使った。

ここで、欲しいのはXとZの列だけを抽出したい。(コピーしたい)
単純に
dd[,c(“X”,”Y”)]

とやると・・・・

[1] “X”  “Y”

と表示され、中身が伴わない。

オプションがあるなんて気が付かなった。

dd[,c(“X”,”Y”),with=F]
—   X    Z
1:123   555
2:345   666

ついでに
list <- c(“X”,”Z”)

dd[,list,with=F]
—   X    Z
1:123   555
2:345   666

思った通りに出来た!
オプション気が付かないです。
多分、これで列の入れ替えも出来るようになりますね。

 

 

 

R フォルダー毎に処理を繰り返す。

R言語でフォルダー毎に処理を繰り返す方法について説明します。

面倒なのでプログラムを以下に

# ディレクトリリストを作成
dir_list <- list.dirs(recursive=T)

#関係するフォルダーを抽出(…/abcで終わるフォルダーを抽出
abc_dirs <- dir_list[c(grep(“\\/abc$”,dir_list))]

for(dir_name in abc_dirs){

# ここでフォルダー毎の処理を行う。

}

対象となるフォルダー数を確認して、フォルダーのリストをグリグリ回そうと思ったのですが、意外と面倒だったので、抽出したフォルダーリストをそのまま使いました。

以下はファイル毎に処理をしたい場合に、ファイルのリストを

all_list <- list.files(“.”,recursive=T,pattern=”sample.csv”)
# abcフォルダーのcsvのみを抽出する。
csv_files <- file_list[c(grep(“/abc/”,all_list))]

#————————————
# フォルダーの分割リストを作る
#   aaa/bbb/ccc/abc/sample.csv => “aaa” “bbb” “ccc” “abc”  “sample.csv”
#————————————

# あとでフォルダー名の一部を使いたいので分解して保存しておく

flist_split <- strsplit(csv_files,”/”)

dst_fname <- paste(“../xyz”,”.csv”,sep=””)

#————————————
# csvを読込む
#————————————
i <- 1
for (fname in dbf_files){
src_csv <- read.csv(fname)

tmp <- src_csv[,c(“COL1″,”COL5”)]

# フォルダー名の一部をCOL_Xに設定しているだけ。
# 単にどこのフォルダーのデータかをカラムに入れたかった
tmp$COL_X <- flist_split[[i]][1]

# 順番を並び替えている

dst_csv <- tmp[,c(“COL1″,”COL_X”,”COL5″)]

#  テキスト形式で書き出してみた。

write(t(dst_csv),dst_fname,ncolumns=3,sep=”,”,append=T)
i <- i + 1
}

write文で本来ならばwrite.csvで一気に書き込みたいところだったのですが、文字列に”aaaaa”とダブルクォーテーションマークが入ってしまうのを避けるため、この様な方法を取ってみました。
他に良い案があれば良かったのですが、初心者なのでこれで一応OKです。

参考になるんだろうか?

とにかく、備忘録です。

P.S. 上記のプログラムは都合によりプログラムの一部のみを記載しております。
ライブラリが足りないなどの場合は適宜ライブラリを追加してやってください。
また、プログラム掲載時に多少変更を加えています。
間違ってしまっている場合もあるかと思いますので動作の保証は致しません。

R 文字列の分割と使い方

R言語で文字列の分割は出来たのだが、その後の使い方が解り難かったので書いておく。
Rの基本的書き方なんでしょうね。

> str1 <- “abs/svf/sss”
> str2 <- strsplit(str1,”/”)
> str2
[[1]]
[1] “abs” “svf” “sss”

分割した要素の一部を取り出すには、以下の様に指定する。
(1番目に分割された文字列を指定した場合)

> str2[[1]][1]
[1] “abs”

リストの中身を指定する方法が解らなくて、他言語と違うと悩みますね。