No.05828 R 超初心者  【てつや】 2008/02/14(Thu) 00:09

以前に書き込ませていただいたものです。

StatViewを使用して大規模データの処理にエラーが出ることが多いため,意を決してRを使い始めることにしました。

しかし,外部データをRに取り込めず困っています。
データを取り込めないまま,もうすぐで一週間になってしまいます。
時間が無限にあるわけではないので,非常に恥ずかしいのですが質問させていただきます。

単純に2群の比較を行おうとして,区切りテキストを取り込もうとしているのですが,毎回エラーとなり,うまくいきません。

作業ディレクトリにあるファイルを
x <- read.table("ファイル名", header=FALSE)
によって取り込みxに代入しようとするのですが,

以下にエラー file(file, "r") : コネクションを開くことができません
追加情報: Warning message:
In file(file, "r") :
ファイル 'ファイル名' を開くことができません, 理由は 'No such file or directory' です

となってしまいます。何がいけないのでしょうか?

No.05829 Re: R 超初心者  【青木繁伸】 2008/02/14(Thu) 00:35

R は,ファイルの入出力はデフォルトのディレクトリを対象に行います。
特定のディレクトリを対象にする (そこにあるファイルから読んだり,そこにファイルを作って結果を書き出す)には,Windows の場合は,メニューバーで「ファイル」→「ディレクトリの変更...」を選び,希望するディレクトリを選択してください。Macintosh の場合は,「その他」→「作業ディレクトリの変更」です。

ファイルを対話的に開くには,
df <- read.table(file.choose(), header=FALSE)
のようにすると良いでしょう。見慣れたやり方で,入力ファイルを指定できます。(これが一番お勧めかも。。なれるとまだるっこしくなるが)

入出力ファイルをデフォルトディレクトリに置いておくとか,デフォルトディレクトリを変更するとか,パス名を指定してファイルを指定するとか,やり方はいろいろあります。

No.05835 Re: R 超初心者  【てつや】 2008/02/14(Thu) 12:15

青木様

早速の対応ありがとうございます。
うまく読み込めました。
file.choose()を使わないとまだ無理ですけど。Windowsなのでツールバーから作業ディレクトリを変更して,このディレクトリの中にファイルを入れているのですが,なぜかエラーになってしまいます。

また,AとBの2群のデータを区切りテキストで保存して,
df <- read.table(file.choose(), header=TRUE)
で読み込み青木先生のソースを使ってマンホイットニーのU検定を行おうとしたのですが,

U.test(A,B)
以下にエラー U.test(A, B) : オブジェクト "B" は存在しません

となってしまいました。今回はそれぞれの群を別テキストに保存して,対処しました。


・・・ここまでは,今後勉強していけば何とかなるのかなと思ってはいるのですが,標本数がA:89437, B:74160のデータでU検定を行うと

> U.test(A, B, correct=FALSE)
U E(U) V(U) Z P value
NA NA NA NA NA
Warning messages:
1: In n1 * n2 : 整数の桁あふれにより NA が生成されました
2: In n1 * n2 : 整数の桁あふれにより NA が生成されました
3: In n1 * n2 : 整数の桁あふれにより NA が生成されました
4: In n1 * n2 : 整数の桁あふれにより NA が生成されました

となってしまいました。まさかこれは大規模データにRが対応できないということではないですよね。

ちなみに
wilcox.test(A, B, correct=FALSE)
以下にエラー wilcox.test.default(A, B, correct = FALSE) :
'x' は数値でなければなりません
となってしまいました(笑)意味不明なので今後勉強します。

No.05838 Re: R 超初心者  【青木繁伸】 2008/02/14(Thu) 13:25

> file.choose()を使わないとまだ無理ですけど。Windowsなのでツールバーから作業ディレクトリを変更して,このディレクトリの中にファイルを入れているのですが,なぜかエラーになってしまいます。

ディ レクトリを変更してから,たとえば x <- 123; write(x, file="test.dat") を実行したとき,そのディレクトリに test.dat というファイルができますか?できたとして,次に scan("test.dat") を実行したとき 123 が読み取られますか?

> AとBの2群のデータを区切りテキストで保存して,df <- read.table(file.choose(), header=TRUE)

A,B の入っているファイルの中身はデータフレームの形式をしていますか?

> U.test(A,B)
> 以下にエラー U.test(A, B) : オブジェクト "B" は存在しません

上の例で言えば,A,B 二群のデータは df というデータフレームに読み込んだのですから,A 群のデータが A という名前の列,B 群のデータは B という名前の列に用意されていたのなら,U.test(df$A, df$B) としないといけませんよ?

> まさかこれは大規模データにRが対応できないということではないですよね。

その,「まさか」です。プログラム中で n1*n2 などという部分がありますが,それらは整数演算されるように書かれているので,n1, n2 が扱える整数範囲内であっても,結果が整数範囲をはみ出すことがあります。ようするに「整数の桁あふれ」です。

> wilcox.test(A, B, correct=FALSE)
> 以下にエラー wilcox.test.default(A, B, correct = FALSE) :
> 'x' は数値でなければなりません

これは上に書いたのと同じですが,wilcox.test(df$A, df$B, correct=FALSE) と書かないといけなくはないですか?
たとえば,コンソールに単に A と入力したら,A 群のデータが表示されますか?
表示されたデータ中に数値以外のものはないですか?たとえ1こであっても,数値以外のものが入っているとデータは factor というものに変換されて読み込まれています。そうすると,wilcox.test プログラムは処理をすることができません。

R がはじめてと言うことですが,基本的なところは必要ですので,チェックしておいてください。
参考書を購入するのがよいでしょうが,
http://aoki2.si.gunma-u.ac.jp/R/Rstat.pdf
の第2章あたりの知識は必要だと思います。

No.05842 Re: R 超初心者  【てつや】 2008/02/14(Thu) 21:08

青木様


詳細な回答をありがとうございます。

一つ解決しました。

> df <- read.table(file.choose(), header=TRUE)
> wilcox.test(df$A, df$B, correct=FALSE)

Wilcoxon rank sum test

data: df$A and df$B
W = 4256775475, p-value < 2.2e-16
alternative hypothesis: true location shift is not equal to 0

しかし,2群をそれぞれテキストに保存したものからデータを取り込むと
> A <- read.table(file.choose(), header=TRUE)
> B <- read.table(file.choose(), header=TRUE)
> wilcox.test(A, B, correct=FALSE)
以下にエラー wilcox.test.default(A, B, correct = FALSE) :
'x' は数値でなければなりません
となってうまくいきませんでした。

また,file.choose()を使用しないデータの読み込みについては,ディレクトリを変更した後に
> x <- 123; write(x, file="test.dat")
を実行し,そのディレクトリに test.dat というファイルができたことを確認しました。
その後に
> scan("test.dat") を実行して
Read 1 item
[1] 123
となりました。

しかし,その後は
> Y <- read.table("test", header=TRUE)
以下にエラー file(file, "r") : コネクションを開くことができません
追加情報: Warning message:
In file(file, "r") :
ファイル 'test' を開くことができません, 理由は 'No such file or directory' です

となってまたもやうまくいきませんでした。


マウス操作に慣れているとRは使いづらいですね。
「Rによるデータ解析」読ませていただきます。

No.05845 Re: R 超初心者  【青木繁伸】 2008/02/14(Thu) 23:00

マウスで R をやるなら,Rcmdr(R コマンダー)をやるのがよいかも
(でも,R コマンダーは,R の能力の一体どれくらいを発揮できているのだろうか??)

>しかし,2群をそれぞれテキストに保存したものからデータを取り込むと
>> A <- read.table(file.choose(), header=TRUE)
>> B <- read.table(file.choose(), header=TRUE)
>> wilcox.test(A, B, correct=FALSE)
> 以下にエラー wilcox.test.default(A, B, correct = FALSE) :
> 'x' は数値でなければなりません
> となってうまくいきませんでした。

その時点で A, B はどうなっていますか?A, B はデータフレームでしょう?
だったら wilcox.test の引数に A や B を与えてもそれは無理でしょう

その時点で str(A) とやるとどのように表示されますか?

> しかし,その後は
> > Y <- read.table("test", header=TRUE)
> 以下にエラー file(file, "r") : コネクションを開くことができません
> 追加情報: Warning message:
> In file(file, "r") :
> ファイル 'test' を開くことができません, 理由は 'No such file or directory' です

read.table のファイル名で,なぜ "test" を指定するのですか?
データファイル名は test.dat なのですから "test.dat" とすべきでしょう。
また,今のテスト例では,ファイルには1つの数値しか入っていないので,変数名はないのですから read.table で header=TRUE を指定することはできないでしょう。指定するなら header=FALSE です。

ファイルを読み込むのに scan を使うのも,read.table を使うのも,その他の関数を使うのも,同じではないのです(それぞれ別の形式で読むことを意味します)
それぞれの読み方において,オプションもそれぞれの意味を持ちます。闇雲にオプションを指示しても無意味です。

難しいと言えば難しいですが,何も分からない状態でやろうとすれば難しいのは当たり前です。

このようなデータファイルの形式ならこの関数を使う,
この関数が読めるデータファイルはこのような形式(オプション)でなければいけない
というのは,制限・制約・面倒な決めごとではなく,必然なのです。

No.05846 Re: R 超初心者  【てつや】 2008/02/14(Thu) 23:59

>read.table のファイル名で,なぜ "test" を指定するのですか?

完全なミスです。わざわざ対応して頂いたのに本当にすみません。

>その時点で str(A) とやるとどのように表示されますか?

> str(A)
'data.frame': 89437 obs. of 1 variable:
$ A: num 0.00 1.47 2.83 4.10 5.57 ...

ちなみに
> str(B)
'data.frame': 74160 obs. of 1 variable:
$ B: num 93.4 93.9 94.3 94.8 95.4 ...

ということで
> A <- read.table("A.txt", header=TRUE)
> B <- read.table("B.txt", header=TRUE)
> wilcox.test(A$A, B$B, correct=FALSE)

Wilcoxon rank sum test

data: A$A and B$B
W = 4256775475, p-value < 2.2e-16
alternative hypothesis: true location shift is not equal to 0

となりました。

>header=TRUE を指定することはできないでしょう。指定するなら header=FALSE です。

少しずつおぼえていきます。

● 「統計学関連なんでもあり」の過去ログ--- 041 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る