# ファイルのダウンロード ---- # インターネット上のファイルを直接ダウンロードして保存することができる # download.file() 関数を利用する download.file("http://www.sip-ac.jp/sip/konan_text/batting-average.txt","batting-average.txt", mode="wb") download.file("http://www.sip-ac.jp/sip/konan_text/batting-average2.txt","batting-average2.txt", mode="wb") download.file("http://www.sip-ac.jp/sip/konan_text/batting-average.xls","batting-average.xls", mode="wb") # download.file() の1つ目の引数がダウンロードしたいファイルのURL,2つ目の引数が保存するファイル名,3つ目の mode は書き込み(w)か追加書き込み(a)かの別 # wb の b はバイナリでの転送.テキストだとなしでよいはずだが,windowsでCR+LFで改行コードが指定されていると無駄な改行が挿入されてしまうの防ぐため # なお mode="wb" の場合は,既にそのファイルがあった場合は上書きされる(元の内容はなくなる)ので注意 # # 閑話休題 # ちなみに初回に苦労した .Rprofile も # download.file("http://www.sip-ac.jp/sip/konan_text/.Rprofile", ".Rprofile", mode="wb") # で保存するのが一番楽だったと思う(今更ですが) # というか,講義資料用のRソースファイルも,ブラウザで # http://www.sip-ac.jp/sip/konan_text/stat.html を確認してもらって新規更新されていたら # download.file("http://www.sip-ac.jp/sip/konan_text/DS1-resume02.R", "DS1-resume02.R", mode="wb") # で02のところの数字だけ入れ替えてダウンロードしてもらった方が楽かもしれません. # データの入力 ---- # 一番基本的な入力方法 ---- # 変数にデータを入力する方法について理解しておくとよい. # コンソールあるいはRのソースファイルで = あるいは <- を使って代入 a = 10 # 右辺(10)が左辺の変数aに代入.逆はダメ 10 = a # ただし不等号を使う方式だとOK 10 -> a a <- 10 # 変数同士のときは注意が必要.結果を比較してみる a = 10; b = 5; a = b a; b a = 10; b = 5; b = a a; b # # キーボードから入力するためには,関数 scan() を利用する(scan() はファイルからも入力可能,後で説明) # 値を打ち込んで Enter を押すの繰り返し.終了するときは値を入れずに Enter だけ押す a = scan() # これだと c() と違いがなくて,あんまり恩恵がない. # scan() が役に立つのは,例えばwebのページで表形式で公開されている数値や文字をコピペするとき # 実演します http://hanshintigers.jp/game/stats_team/bat27.html # windowsの場合 scan("clipboard", sep = "\t", what = "") # Windows用 # webの表の場合,文字列の区切りはタブになっているので sep に "\t",文字なので what = "" とする(デフォルトは数値) # macの場合 scan(pipe('pbpaste'), sep = "\t", what = "") # Mac用 # 行に文字列と数値が混在している場合は list型で取り込む(後述) # RStudio.Cloudの場合 # Linuxでクリップボードから貼り付けるためのxclipなどが実装されていないようなので,通常のLinuxでの取り込み方法は現時点では利用できない. # そのため,まず何か適当なファイルにコピーして保存し,それをscan()で読み込めばよい # FileメニューからNew File→R scriptを選ぶと,新しいファイルがsource editorに作成される # そこにコピーした内容を貼り付ける # 適当な名前をつけて保存(例えば,clipboard001.txt) scan("clipboard001.txt", sep = "\t", what = "") # RStudio.Cloud用 # キーボードからの入力は readline() も利用できる. b = readline("プロンプトに使う文字列:") # ただし文字列として格納されるため,数値として使いたい場合は取り込んだ後 as.numeric() などで変換する必要がある # 閑話休題:桁区切りのカンマが邪魔 ---- # 慣例的に桁数の多い数値で3桁ごとに桁区切りのカンマを入れる # 人間が見る分には便利かもしれないが,数値を扱う側からするとかなり邪魔 # 例えば 1,000 は数値でなくて扱い上は文字列になる a=1,000 # エラーになる # ネット上のデータを scan() で取り込む場合は gsub() を使って次のように置き換える gsub(",", "", "1,000") # 置き換えるパタン(文字列),置き換える結果(文字列),置き換える対象 # 半角カンマ(パタン)を文字なし(結果)に置き換えて取り除いている # その後で as.numeric() などを使って数値に変換してやればよい # ファイルからの入力 ---- # csv形式のファイルは各行のデータが半角のカンマで区切られている # この場合,関数 read.csv() を利用するのが簡単.データフレームとして読み込まれる data1=read.csv(file="batting-average.txt", fileEncoding="utf8") # fileEncoding="utf8" の部分は,読み込もうとするファイルの文字コードにより変更する # 1行目は自動的にヘッダとして処理される # なお関数 read.table() でも同様の処理が可能 data2=read.table(file = "batting-average.txt", header = T, fileEncoding = "utf8", sep = ",") # ただしデータの区切りを明示的に sep="," として指定する必要があるのと,ヘッダの有無を header=T で指定する必要がある # データがカンマ以外,例えばタブで区切られている場合 # この場合は,関数 read.table() を使えばよい read.table(file = "batting-average2.txt", header = T, fileEncoding = "utf8") # read.table() の区切り文字の初期指定は sep="" なので,タブ,空白,改行が区切り文字であれば省略可 # なお自分のパソコン上に保存されているデータの場合は file.show() を使って区切り記号などを確認できる file.show("batting-average.txt") file.show("batting-average2.txt") # Excel形式のファイルの読み込み ---- # readxlライブラリを利用するとよい # https://cran.r-project.org/web/packages/readxl/index.html # 標準ではライブラリが利用可能になっていないので,まずインストールする必要がある install.packages("readxl") # Do you want to install from sources the package which needs compilation? y/n: # と表示されたら y を押して Enter # しばらく勝手に動くので待つ # 終了したら library("readxl") # 注意:library("readxl") はRStudioを起動するたびに実行する必要がある # 読み込みは read_excel() 関数を利用する data3=read_excel("batting-average.xls") # なおブック形式(複数のシートがある場合)はシートを指定することで一部のシートだけを読み込むこともできる read_excel("batting-average.xls", sheet=1) # sheet はシート名を文字列で与えてもよいし,先頭からの順番を数値で与えてもよい # range で指定して,一部のセルの範囲だけを読み込むことも可能 read_excel("batting-average.xls", range="a2:c5", col_names=F) # ただしセル範囲にヘッダが含まれないときは,ヘッダを含んでいないことを col_names=F で指定する必要がある # インターネット(HTMLファイル)の表データからの入力 ---- # XMLパッケージを使ったウェブに公開されている表の取り込み # 読み込みに利用する関数 readHTMLtable() を使用するためには,標準で用意されていないパッケージをインストールする必要 install.packages("XML") # インストール完了後にパッケージを読み込み library("XML") # 注意:library("XML") はRStudioを立ち上げるたび毎回実行する必要あり # これで使用する準備が完了 # # 例えば阪神タイガースのサイトから打撃成績を読み込んでみる # http://hanshintigers.jp/game/stats_team/bat27.html data4 = readHTMLTable("http://hanshintigers.jp/game/stats_team/bat27.html") # なお何でも読み込める訳ではない.対応していない場合はエラーが表示される # ちなみにこのページには3つの表があるので,どの表を読み込むかを which で指定する # RStudio.CloudやMacの場合はもともとUTF8なので header = T で読み込めば,以下の所のヘッダの細工は不要 data4=readHTMLTable("http://hanshintigers.jp/game/stats_team/bat27.html", fileEncoding="utf8", header = T, stringAsFactor=F, colClasses = c(rep("character",2),rep("numeric",19)), which = 1) # 上の例の fileEncoding="utf8" の部分は,読み込もうとするhtmlのソースファイルの文字コードに依存する # ソースを表示させて先頭の方に文字コードの指定があるのでそれにあわせればよい # 列のデータを利用する場合は data4[[5]] # [ が2重になるところに注意 # 5列1行目なら data4[[5]][1] # Windowsの場合は(たぶん)ヘッダが文字化けするので, header = F でなしを指定して読み飛ばす data4=readHTMLTable("http://hanshintigers.jp/game/stats_team/bat27.html", fileEncoding="utf8", header = F, stringAsFactor=F, colClasses = c(rep("character",2),rep("numeric",19)), which = 1) # ヘッダの細工 # Webから読み込んだときにヘッダ部分がよく文字化けするので,後からデータフレームの列名を指定してやる # どうもtableタグでtheadタグを使って列見出しをマークアップすると,取り込みの時の文字コードの指定が有効にならずに,OSデフォルトのsjisで取り込んでしまうみたい(readHTMLTableのバグやと思います) # ヘッダの行をドラッグしてコピー(クリップボードに保存されている) # windowsの場合 colnames(data4)=scan("clipboard", sep = "\t", what = "") # 文字列の区切りはタブになっているので sep に "\t",文字なので what = "" とする # macの場合(もし化けていたら,たぶん文字化けせずに header = T で問題ないはず) colnames(data4)=scan(pipe('pbpaste'), sep = "\t", what = "") # 別のやり方で文字化けの直し方(たぶんこっちの方が楽) # 先ほどはヘッダなしで読み込んだが,ヘッダ付きで読み込む data4=readHTMLTable("http://hanshintigers.jp/game/stats_team/bat27.html", fileEncoding="utf8", header = T, stringAsFactor=F, colClasses = c(rep("character",2),rep("numeric",19)), which = 1) # ヘッダはutf8でなくsjisで読み込まれているので,iconv()というコマンドで書き直してやる colnames(data4)=iconv(colnames(data4), "utf8", "sjis") # ただしこの方法を使うときは必ず colnames(data4) # 列名が表示されることを確認する必要がある. # captionタグで表にタイトルがついているときは,names 属性つきのlist型として取り込まれる(第1要素が取り込んだ表のデータフレーム)ので,オブジェクト名$タイトルがデータフレームとなる # 例えば http://www.sip-ac.jp/sip/konan_text/mis06-05.html の場合,マトリクス図法の一例というタイトルがついている data4a=readHTMLTable("http://www.sip-ac.jp/sip/konan_text/mis06-05.html", header = T, fileEncoding="utf8",colClasses = c(rep("character",4))) # ヘッダ部分が文字化けした場合,先ほどと同様のやり方で修正すると colnames(data4a)=iconv(colnames(data4a), "utf8", "sjis") # これだとエラーが出る # data4a は list型になっている class(data4a) data4a$マトリクス図法の一例 class(data4a$マトリクス図法の一例) # したがってヘッダの文字化けを修正する場合,次のようになる colnames(data4a$マトリクス図法の一例)=iconv(colnames(data4a$マトリクス図法の一例), "utf8", "sjis") # データフレームで扱いずらいので(文字化けの有無に関わらず) data4a = data4a$マトリクス図法の一例 class(data4a) # データフレーム部分だけをオブジェクトに再代入するとよい # 再代入した後で,上の説明のcolnames()で文字化けを直すとうまくいく # なおこれは読み込んだ表データがdata.frame型でなくlist型と識別されているときも,再代入の処理をした方が扱いやすい # 警告メッセージが出てうまく読み込めないとき ---- # 次のサイト https://baseball.yahoo.co.jp/npb/stats/batter?series=1 は上で説明したやり方だと # 例えば次のような警告メッセージが出てうまく読み込めない('http以下はサイトにより変わる) # 警告メッセージ: XML content does not seem to be XML: # 'https://baseball.yahoo.co.jp/npb/stats/batter?series=1' # この場合は一旦読み込みたいページのソースファイルを自分のPCに保存する(htmlのソースファイルだけでよい) # その保存したファイルを読み込んでやればよい # 別の方法は scan() を利用して,読み込むデータの型を適切にしてしてコピペするとデータフレームとして読み込める # 前準備としてデータフレームの列名が必要となるので別途整形しておく # この場合, # 順位,選手名,チーム,打率,試合,打席,打数,安打,二塁打,三塁打,本塁打,塁打,打点,得点,三振,四球,死球,犠打,犠飛,盗塁,併殺打,出塁率,長打率,得点圏,失策 # このうち,選手名とチームは文字列でその他は数値で読み込んでやればよい # 列のデータ型の指定は,例えば 選手名="" や 打率=numeric(0) としてやるとそれぞれ文字列,数値として認識してくれる # これを並べるので list() を使って what=list( ) のように指定する # what=list(順位=numeric(0),選手名="",チーム="",打率=numeric(0),試合=numeric(0),打席=numeric(0),打数=numeric(0),安打=numeric(0),二塁打=numeric(0),三塁打=numeric(0),本塁打=numeric(0),塁打=numeric(0),打点=numeric(0),得点=numeric(0),三振=numeric(0),四球=numeric(0),死球=numeric(0),犠打=numeric(0),犠飛=numeric(0),盗塁=numeric(0),併殺打=numeric(0),出塁率=numeric(0),長打率=numeric(0),得点圏=numeric(0),失策=numeric(0)) # まず表をヘッダを除いてデータのところだけ選択してコピーしてから,windowsは次のコマンドを実行 data5=scan("clipboard", sep = "\t", what=list(順位=numeric(0),選手名="",チーム="",打率=numeric(0),試合=numeric(0),打席=numeric(0),打数=numeric(0),安打=numeric(0),二塁打=numeric(0),三塁打=numeric(0),本塁打=numeric(0),塁打=numeric(0),打点=numeric(0),得点=numeric(0),三振=numeric(0),四球=numeric(0),死球=numeric(0),犠打=numeric(0),犠飛=numeric(0),盗塁=numeric(0),盗塁死=numeric(0),併殺打=numeric(0),出塁率=numeric(0),長打率=numeric(0),OPS=numeric(0),得点圏=numeric(0),失策=numeric(0))) # macは data5=scan(pipe('pbpaste'), sep = "\t", what=list(順位=numeric(0),選手名="",チーム="",打率=numeric(0),試合=numeric(0),打席=numeric(0),打数=numeric(0),安打=numeric(0),二塁打=numeric(0),三塁打=numeric(0),本塁打=numeric(0),塁打=numeric(0),打点=numeric(0),得点=numeric(0),三振=numeric(0),四球=numeric(0),死球=numeric(0),犠打=numeric(0),犠飛=numeric(0),盗塁=numeric(0),盗塁死=numeric(0),併殺打=numeric(0),出塁率=numeric(0),長打率=numeric(0),OPS=numeric(0),得点圏=numeric(0),失策=numeric(0))) # RStudio.Cloudは,前述と同じくファイルに一旦保存してそれを読み込む方法を使う # ここでは先ほど同じファイルclipboard001.txtにコピー(ただし先に保存されている内容はコピー前に削除する) data5=scan("clipboard001.txt", sep = "\t", what=list(順位=numeric(0),選手名="",チーム="",打率=numeric(0),試合=numeric(0),打席=numeric(0),打数=numeric(0),安打=numeric(0),二塁打=numeric(0),三塁打=numeric(0),本塁打=numeric(0),塁打=numeric(0),打点=numeric(0),得点=numeric(0),三振=numeric(0),四球=numeric(0),死球=numeric(0),犠打=numeric(0),犠飛=numeric(0),盗塁=numeric(0),盗塁死=numeric(0),併殺打=numeric(0),出塁率=numeric(0),長打率=numeric(0),OPS=numeric(0),得点圏=numeric(0),失策=numeric(0))) # ただし,この方法でデータを読み込んだ場合,データフレームではなくリストとして取り込まれる. # オブジェクトの型を調べるためには class() コマンドを利用すればよい(既出) class(data5) # そのため,次のコマンドでデータフレームに変換しておいた方が使い勝手がよい data5 = data.frame(data5) # あるいは data5 = as.data.frame(data5) class(data5) # ファイルの出力 ---- # Rのデータフレームをファイルに出力するときには write.csv や write.table を利用する # file で出力ファイル名を指定する(省略不可) # append =T の指定がなければ,既にファイルが存在しているときは上書き保存される(省略時は append = T) write.csv(data2,file = "ba.txt", quote = F, row.names = F, fileEncoding = "utf8") write.table(data2,file = "ba2.txt", quote = F, row.names = F, fileEncoding = "utf8") # なお write.csv の区切り記号は半角のカンマ,write.table の区切り記号はタブになる # 変更したい場合は sep = "\t" のように指定すればよい # 出力ファイルの拡張子は"ba.csv"のように csv でも可 # オブジェクトの保存と読込 ---- # 単独のデータフレームだけでなく,複数のオブジェクトを保存することもできる. # 作業を中断して,後日再開する場合などに便利 # このときは save() を利用するとよい # file = で保存するファイル名を指定する # file より前に保存したいオブジェクトを半角カンマで区切って列挙 save(data2, file = "my1.RData") rm(data2) # 試しに一旦 data2 を削除 data2 # 保存したオブジェクトを読み込むときは load() を利用する # 引数には保存した RData ファイル名を書く load("my1.RData") data2 # 一部のオブジェクトだけでなくすべてのオブジェクトを保存する場合には save.image() を利用する save.image() # save.image() で引数を指定しない場合は .RData というファイルに保存されるが,自分で名前を付けて保存したい場合には file で指定する save.image(file = "my2.RData") # rm() の引数として list = ls() とすると全オブジェクトを消去できる rm(list = ls()) # save.image() は引数を指定していない場合は自動的に .RData というファイル名で保存しているので,それを load() で読み込む load(".RData") # なお名前を自分で付けた場合は名前を指定する必要がある load("my2.RData")