読者です 読者をやめる 読者になる 読者になる

ほんとのこと知りたいだけなのに。

夏休みはもうおわり。

はじめてのR言語。RCL@Common Lispで。 (その参)

Common Lisp R言語 RCL

今回は はじめてのR の「3章 データファイルの読み込み・Rエディタの利用」を RCLでやってみるけぇね。

はじめてのR: ごく初歩の操作から統計解析の導入まで

はじめてのR: ごく初歩の操作から統計解析の導入まで

目次

1.全てのオブジェクトを削除する。
2.作業ディレクトリへの操作。
3.CSVファイルの読み込み。
4.CSVファイルを入力にした簡単な統計関数の実行。

全てのオブジェクトを削除する。

>(r "rm" "list=ls()")
NIL

ってこれでイケとるんかな。確かめる方法が良くわからん。

まぁ、面倒じゃけぇ今回はエエわ。 エラーにならんかったし。

作業ディレクトリへの操作。

作業ディレクトリの取得、変更は getwd, setwd でできるけぇ。

getwd はこんな感じ。

R> (r "getwd")
("/home/user/junk")
R> [getwd]
("/home/user/junk")

setwd はこんな感じ。

R> (r "setwd" "/tmp/")
("/home/yanqirenshi/junk")
R> (r "getwd")
("/tmp")
R> [setwd "~/tmp/"]
("/tmp")
R> [getwd]
("/home/yanqirenshi/tmp")

CSVファイルの読み込み。

CSVの内容は書籍の内容を拝借。感謝!!

今回のファイルは /home/user/tmp/test.csv に置くことにするけぇ。

number,sex,testA,testB
1,f,56,51
2,f,67,45
3,m,43,72
4,m,19,70
5,m,38,59
6,f,56,72
7,m,54,82
8,f,81,66
9,m,67,49
10,f,63,37

CSVファイルの読み込みはフルパスしてもええし、作業ディレクトリに置いとるんならファイル名でもええんよ。 あんたの好きにしんさい。

(1) フルパスの場合 
/home/user/tmp/test.csv
(2) 作業ディレクトリに置いとる場合
test.csv
./test.csv

CSVの読み込みは read.csv でやるんじゃけど、何も考えんと実行するとエラーが発生するけぇね。 気をつけんとイケよ。

こんとな感じになるけぇ。

(r "read.csv" "/home/yanqirenshi/tmp/test.csv")

---- debugger ----
Control stack exhausted (no more space for function call frames).
This is probably due to heavily nested or infinitely recursive function
calls, or a tail call that SBCL cannot or has not optimized away.

PROCEED WITH CAUTION.
   [Condition of type SB-KERNEL::CONTROL-STACK-EXHAUSTED]

Restarts:
 0: [RETRY] Retry SLIME REPL evaluation request.
 1: [*ABORT] Return to SLIME's top level.
 2: [ABORT] Abort thread (#<THREAD "repl-thread" RUNNING {10043200B3}>)

Backtrace:
  0: (SB-KERNEL::CONTROL-STACK-EXHAUSTED-ERROR)
  1: ("foreign function: call_into_lisp")
  2: ("foreign function: post_signal_tramp")
 --more--

どがぁなことしても出来んかったけぇ困ってしもぉてね。作ったカルロスさんにメールで聞いたいね。

ほしたら rcl は R のオブジェクトを lispオブジェクト に変換する機能が弱いらしゅうて、無限ループに入ってしまうんじゃって。

なるほど、前回で factor型が integer型になっとたんもその所為じゃったんじゃね。

回避策のコードもくれたんじゃけど、強引な感じじゃったし オススメじゃないみたいじゃって。

カルロスさんのオススメはイチイチ lispオブジェクトに変換せんでもええけぇ、Rの中でやりんさいって言っとった。 lispオブジェクトに変換してもRには戻せんのんじゃけぇね。って。(たぶん)

じゃけぇ以下の方法でポインタ取得したらエエみたい。

r% を使ぉたら lispオブジェクトにせんと Rのポインタだけ返すんじゃって。

;; こんな感じ。
R> (r% "read.csv" "/home/yanqirenshi/tmp/test.csv")
#<R-POINTER :GENERIC-VECTOR #.(SB-SYS:INT-SAP #X7FFFE8643800) {1011FC5FE3}>

それを変数に入れて印刷するとこんな感じ。 変数に入れるんも r% を使わんにゃぁイケンよ。じゃないと lispオブジェクトに変換しようとするけぇね。

R> (r% "<-" "テストデータ" (r% "read.csv" "/home/yanqirenshi/tmp/test.csv"))
#<R-POINTER :GENERIC-VECTOR #.(SB-SYS:INT-SAP #X7FFFE8380F40) {10124979C3}>
R> (r "print" (r-variable "テストデータ"))
;R#    number sex testA testB
;R# 1       1   f    56    51
;R# 2       2   f    67    45
;R# 3       3   m    43    72
;R# 4       4   m    19    70
;R# 5       5   m    38    59
;R# 6       6   f    56    72
;R# 7       7   m    54    82
;R# 8       8   f    81    66
;R# 9       9   m    67    49
;R# 10     10   f    63    37
#<R-DATAFRAME 4 rows, column names :|number| :|sex| :|testA| :|testB| {10127DCBA3}>

R> (r "dim" (r-variable "テストデータ"))
(10 4)

とりあえずこれはクリア。

ほんま、キチんとメールに返信くれたカルロスさんにぶち多謝じゃけぇ!!

CSVファイルを入力にした簡単な統計関数の実行。

なんか上手いこといかん。。。。カルロスさんに聞いてみよう。。。。

今度加筆するわ。。。

次回へ

つぎは記述統計じゃね。

でも上の先送りしたやつ使えんと困るねぇ。。。

ほいじゃぁ、またね。