Rでデータファイルからヒストグラムを作成する方法

このQ&Aのポイント
  • Rを使用してデータファイルからヒストグラムを作成する方法について質問です。
  • 読み込んだデータファイルから指定した列のデータを抽出し、ヒストグラムを表示する方法を教えてください。
  • ヒストグラムの作成中に 'x' は数値でなければならないというエラーが発生しています。解決策を教えてください。
回答を見る
  • ベストアンサー

Rでデータファイルからヒストグラムを作成したい。

以下の様なデータファイルをRで読み込んでヒストグラムを書きたいのですが、どのようにすれば良いのか、途中で詰まってしまいました。 hist() を使いたいのですが、なぜかうまくいきません。 まず、ファイル("/test.txt")があります。 a1|302.46|235.56|53.697|39.4994|821.3049 a2|85.866|2.6232|133.33|13.6709|51.0768 a3|217.666|23.4868|0.458|678.454|67.545 ・・・・ ・・・・ (一番右に行名、その右に5つ、'|'で区切られた数値が並ぶ。 これが1万行程度続くファイルです。) 1列目のデータをすべて集めてヒストグラムに。 次に2列目のデータを集めてヒストグラムに。次も、、、という段取りで x軸は値,y軸は列番号,z軸は頻度という多次元ヒストグラムを 書くのが最終目標ですが、とても到達できそうにありません。 どなたか、お助けいただけませんでしょうか。 以下が私が行った操作です。 ## ファイル内容をRにて読み込みます。 > dataset <- read.table("/test.txt", header=FALSE, sep="|") ## 次に2列目のみdata2に格納します。 > data2 <- dataset[c(2)] ## 最後にヒストグラムを書かせようとします。 すると、エラーを吐いてしまいます。 > hist(data2) 以下にエラー hist.default(data2) : 'x' は数値でなければなりません データの並び(?)が問題なのかと思って > array <- c(data2) > hist(array) としましたが、これも同じエラーを吐いてしまいました。 データの数値に問題があるのかと思い、以下のようにしてみたのですが これはエラーを吐かずにヒストグラムをつくってくれました。 > list <- c(5.43624 2.061215 1.0185 1.0622) > hist(list) どなたか、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#227064
noname#227064
回答No.2

すみません。 ご質問の > ## 次に2列目のみdata2に格納します。 > > data2 <- dataset[c(2)] を2行目を読み込んでいるものと勘違いしてました。 (よく見ないといけませんね) とはいえ、 > 以下にエラー hist.default(data2) : 'x' は数値でなければなりません となる理由はNo.1でも書いたとおりです。 No.1の補足のエラーもデータフレームにas.numericを適用しようとしたためでたエラーです。 ですので、No.1の回答での > hist(data2[-1]) と > hist(as.numeric(data2[-1])) は無視してください。 ご質問の場合では、 hist(dataset[,2]) 又は hist(dataset$V2) でヒストグラムを作成すればいいだけでした。 お騒がせいたしました。

miyakosais
質問者

お礼

どうもありがとうございます!! 見事にグラフができました☆ あとは、2列目~6列目のヒストグラムを 1つのグラフ内に並べて視覚的に 捉える方法を模索するのみなのですが それはRでは不可能なのでしょうか。 何度も申し訳ありません。

その他の回答 (2)

noname#227064
noname#227064
回答No.3

> あとは、2列目~6列目のヒストグラムを > 1つのグラフ内に並べて視覚的に > 捉える方法を模索するのみなのですが > それはRでは不可能なのでしょうか。 不可能かどうかでいわれると、できなくはないでしょう。 残念ながら、2次元のヒストグラムが簡単にできる関数が用意されているか私は知りません。 (最悪自分で作るという方法が残っていますが……) 代用になりそうな関数なら、perspやcontourあたりでしょうか。 ご存知かもしれませんが、Rの使い方を説明しているホームページを参考URLに挙げておきます。 こちらのグラフィックス篇が参考になるかと思います。 ここまで書いてから、cranで検索してみたところgplotsライブラリにhist2dというものがありました。 2次元で色わけするものですが、これなんかはいかがでしょうか?

参考URL:
http://cse.naro.affrc.go.jp/takezawa/r-tips/r.html
miyakosais
質問者

お礼

どうもありがとうございました。 gplotsを試してみたいと思います。 ご丁寧に本当にありがとうございました。

noname#227064
noname#227064
回答No.1

datasetの中身を確認してみてください。 1列目がa1, a2,……でこれは当然数値ではありません。 では hist(data2[-1]) ならいいのかというと、これでもうまくいきません。 何故ならhistがベクトルしか受け取れず、data2[-1]はデータフレームであるためです。 hist(as.numeric(data2[-1])) ならヒストグラムが作れます。

miyakosais
質問者

補足

どうもありがとうございます。 データフレームとベクトルの違いなどが 理解できていなかったようなので、ご返答いただいてから 勉強していたのですが、やはり目的が達成できず困っています。 以下のようなエラーが出るのですが、これはどうすれば良いのでしょうか。 何度もすいません。 > hist(as.numeric(data2[-1])) 以下にエラー hist(as.numeric(data2[-1])) : (list)オブジェクトは 'double' に変換できません

関連するQ&A

  • MATLAB ヒストグラム 数値データ

    あるn行2列の行列からヒストグラムを作成し、他のn行2列の行列のヒストグラムと「どれだけ似ているか」を評価したいです。 まず、2次元のヒストグラムを数値で取り出す方法がわかりません。その際、x・Y軸は行例つかんで固定(一定に)したいです。 そして、ヒストグラム同士の相関をとればいいのかな、と思うのですが、どうでしょうか。 どうか、どなたかよろしくお願いします。

  • Ruby ヒストグラムの作成

    画像の輝度値が保存されたtxtファイルを開いて、輝度値のヒストグラムを表示したいのですがrubyの配列の操作に戸惑っています。histgram[value] += 1のvalueが不確定なのでnilになってしまいます。何か良い解決方法はありますか? image.txtは 輝度値 その他の情報となっているためsplit[0]で輝度値部分のみを抽出しています。 f = open('image.txt') color = Array.new histogram = Array.new correlation = Array.new n = 0 while c = f.gets color[n] = c.split[0].to_i value = c.split[0].to_i histogram[value] += 1 if(n>1) correlation[value + 50 * color[n-1] ] += 1 end n+=1 end f.close

  • 統計ソフトrでのヒストグラムの作成について

    下記のようなデータセットを仮定して、 x軸に分類 a1 a2 a3、 y軸に各分類における反応 1の頻度とするヒストグラムを作成したいのですが、 うまくいかず困っています。 どのような方法がありますでしょうか? 分類 反応 a1  1 a3  2 a1  2 a2  1 ...  ... よろしくお願い致します。

  • ファイルのデータの並べ替えについて

    data.txtに入力されたA 100 B 300 C 200 D 300を 数値の大きい順に並べて、data2.txtに出力するプログラムを作成したいのですが何をすればいいのかわかりません。 一応、data.txtファイルはプログラムできました。 ヒントだけでもいいので教えてください。 あと、同点の場合はアルファベット順にしたいです。 よろしくご指導お願いします<(_ _)>

  • 受け取ったデータを基にファイルを操作

    お世話になっております。 以下の内容に行き詰まっております。アドバイスのほど頂戴出来ればと投函しました。宜しくお願いいたします。 やりたいこと。 GETにて受け取ったデータ(URL)を基に、同じディレクトリ内のデータファイル(data.txt)に登録のあるデータから、受け取ったURLを削除した内容で書き換えたい。 ※data.txtは、行単位で各データがタブ区切りで以下のように登録されている。 URL 日付 メール … URL 日付 メール …   現状の報告 以下のスクリプトが実際に作成したものですが、現在、受け取っただけではファイル内容を書き換えることが出来ず、リロードしないと駄目な状況となっています。 アドバイス頂きたいこと。 1.スクリプト自体におかしなところ、見直すべきところがあるか? 2.data.txtを書き換えるスクリプトで、もっと効率のよいものはあるか? 以下がその現在のスクリプトです。 <?php $url = $_GET["url"]; $addfname = "./data.txt"; @$data_array = file($addfname); $data_cnt = count($data_array); $data_array2 = $data_array; $s=0; for($i=0; $i<$data_cnt; $i++){  $data_text = explode("<>", $data_array[$i]);  if($url == $data_text[0]){//GETデータと同じURLだったら配列から削除   $s++;   $key = $i - $s + 1;   array_splice($data_array2, $key, 1);  } } //data.txtのデータ上書き $file=fopen("$addfname", "w") or die("OPENエラー $file_name"); flock($file, LOCK_EX); for($i=0; $i<count($data_array2); $i++){ $new_data = $data_array2[$i]; fputs($file, "$new_data"); } flock($file,LOCK_UN); fclose($file); ?> 先にも述べましたが、現状ではこのスクリプトを実行した後、リロードしなければファイル(data.txt)の書き換えが出来ない状況となっています。どんな些細なことでも構いません。ご意見、アドバイスを頂戴できれば幸いです。お忙しい中恐縮ですが宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • VB6:テキストファイルから特定の文字列に続く数値を抜き取りたい

    お世話になっております。 Visual Basic 6にて テキストファイルaから特定の文字列に続く数値を 抜き取りたいと思っております。 テキストファイルaのパス: C:\a_file.txt テキストファイルaの内容: トヨタ自動車(株) (東証1部:7203),取引値15:00 4,100,1株配当45.00円 抜き取り後のテキストbの内容: 7203 15:00 4,100 45.00 抜き取り後のテキストファイルbのパス: C:\b_file.txt ”東証1部”の次、”取引値”の次、というように特定の文字列の後に抜き取りたい数値があるので、InStr関数やMid関数を用いればできるのではないかと思い。 以下のようにしてみました。 ---コード:ココカラ Set fs = CreateObject("Scripting.FileSystemObject") Set a = fs.CreateTextFile("C:\a_file.txt", True) Set b = fs.CreateTextFile("C:\b_file.txt", True) data = Mid(a.innerText, InStr(a.innerText, "1株配当") + 5, 7) b.Write (data) ---コード:ココマデ data = Mid(a.innerText。。。の行でエラーが出ます。 エラー内容:(実行時エラー438)オブジェクトはこのプロパティまたはメソッドをサポートしていません このエラーの部分を解決できれば、本問題解決への糸口になるのではと思っております。 すなはち、テキストaから特定文字列”東証1部”の位置検出、文字切り出しをまず解決したいと思っております。 どうぞよろしくお願いいたします。

  • C++ ドラッグ&ドロップによるテキストデータ読込

    C++初心者です。 aaa.txtのデータ(数値がたくさん並んでいるもの)を読み込んである列の平均値を出すなど計算したいと思っています。 しかしaaa.txt以外にも計算したいテキストデータがたくさんあり、そのたびいちいちソースを弄ってテキストの名前を変えるのはおっくうです。 今は、次のようにファイルを読み込んでいます。 ifstream ifs("aaa.txt"); そこでexeファイルにドラッグ&ドロップしてそのテキストファイルの数値を勝手に読み込んでくれるように改変できるでしょうか?

  • データファイルの処理と保存について

    はじめまして。 C言語についてまだ勉強が不十分なので、ご質問させていただきます。 現在、あるいくつかのデータファイルがあります。 中に入っているデータ数は2000行以上です。 列は3列です。 これを分割したいのですが、1つのデータファイルは100個で構成します。 その100個スケールを10個ずつずらして新しいファイルに入れていきます。 今Excelで手作業でやっているのですが、大変時間がかかります。 Excelですと、行番号1~100を取り出して新しいファイル「ファイル名_1.txt」をつくり、次に先ほどの100番目までのデータのうち、10番目まで削除して行番号11~110を取り出して新しいファイル「ファイル名_2.txt」を作成。 つまりこのファイルは90個のデータが重なっています。 □内にデータが10個だとすると □□□□□□□□□□  □□□□□□□□□□   □□□□□□□□□□    □□□□□□□□□□ といったように10ずつずらして、このようなことを繰り返しているのですが、現在総数666個のデータを用いて分割し、57個のデータファイルができました。 ファイルはそれぞれ100ずつとしていますが、最後のみ106個です。 このようなことをCでできないでしょうか。 ・100個スケールを10個ずつずらして格納。 ・出力ファイル名は「ファイル名_n.txt」(n=1,2,3,4...) ご協力お待ち申し上げております。 よろしくお願いいたします。

  • 二つのファイルを読み込み、一つのファイルへ出力を行うプログラム

    初めて質問させていただきます。 専門学校にて以下のようなPerlの課題に取り組んでおります。初学者です。 ---------- 二つのファイルを読み込み、一つのファイルに出力を行う。但し、以下の条件で出力を行うこと。 (1)ファイルはすでにソートされているものとし、プログラム内でソートを行う必要はない。 (2)同じデータは一つしか出力しない。 ---------- 課題の意図としては、二つのファイルから一行ずつデータを読み込み、文字列比較をさせたのち、既出のもの(重複)は出力させない~みたいなことを求められています。 ---------- ■データ例 「A.txt(元データファイル)」 A00001 A00002 「B.txt(元データファイル)」 A00000 A00002 A00005 「C.txt(結果出力ファイル)」 A00000 A00001 A00005 ---------- まず、行き詰っているのは二つの元データファイルからデータを一行ずつ読み込み、比較する部分です。 関数で読み込ませ、if文で文字列比較するのはなんとなく分かるのですが、どう表現させてよいのかが、いまひとつ分かりません。 回答はじめ、ヒントとなる基本的な考え方を教えていただけると幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • MS Office Excel 2003でテキストデータファイルを読み

    MS Office Excel 2003でテキストデータファイルを読み込む方法 1111.txt 2222.txt 3333.txt というテキストデータファイルがあり、中身は添付画像の様になっています。 (テキストファイルは同じフォルダに格納されています) このテキストデータをExcelに読み込みたいのですが、以下の様な動作をして欲しいと思っています。 (1)セルA1にテキストデータファイルのファイル名(拡張子は省く)を入れる (2)セルA2から下に、添付ファイルのA列のデータが入り、セルB2から下にE列のデータが入る (3)セルA1に別のファイル名を入れると、そのファイルのテキストデータに切り替わる このような事は可能なのでしょうか? もし可能であれば教えて下さい。 よろしくお願いします。