Rチュートリアル:データをRにインポートする方法
完全な本を入手する

この記事は、出版社の許可を得て、「マスコミとジャーナリズムのための実用的なR」から抜粋したものです。©2019by Taylor&Francis Group、LLC。
データを分析して視覚化する前に、そのデータをRに取り込む必要があります。これを行うには、データのフォーマット方法と場所に応じて、さまざまな方法があります。
通常、データのインポートに使用する関数は、データのファイル形式によって異なります。たとえば、ベースRでは、を使用してCSVファイルをインポートできますread.csv()
。Hadley Wickhamは、ご想像のとおり、Excelファイルを読み取る機能を備えたreadxlというパッケージを作成しました。Googleスプレッドシートからデータを取得するための別のパッケージgooglesheetsがあります。
しかし、それをすべて覚えたくない場合は、リオがあります。
リオの魔法
プロジェクトのGitHubページによると、「rioの目的は、スイスアーミーナイフスタイルで3つの単純な関数を実装することにより、RでのデータファイルI / O [インポート/出力]を可能な限り簡単にすることです」。これらの機能はimport()
、export()
とconvert()
。
したがって、rioパッケージには、さまざまな種類のファイルを読み込むための関数が1つだけありますimport()
。の場合import("myfile.csv")
、CSVファイルを読み取る関数を使用することを知っています。import("myspreadsheet.xlsx")
同じように機能します。実際、rioは、タブ区切りデータ(拡張子.tsv)、JSON、Stata、固定幅フォーマットデータ(.fwf)など、20を超えるフォーマットを処理します。
このチュートリアルに必要なパッケージ
- リオ
- htmltab
- readxl
- googlesheets
- パックマン
- 管理人
- rmiscutils(pm GitHub)またはreadr
- ティブル
データを分析した後、結果をCSV、Excelスプレッドシート、またはその他の形式で保存する場合は、rioのexport()
関数で処理できます。
システムにrioパッケージがまだインストールされていない場合は、を使用して今すぐインストールしてくださいinstall.packages("rio")
。
ボストンの冬の降雪データを使用して、いくつかのサンプルデータを設定しました。//bit.ly/BostonSnowfallCSVに移動し、右クリックしてファイルをBostonWinterSnowfalls.csvとして現在のRプロジェクトの作業ディレクトリに保存できます。しかし、スクリプトのポイントの1つは、面倒であろうとなかろうと、手作業を再現しやすい自動化に置き換えることです。クリックしてダウンロードする代わりに、次download.file
の構文でRの関数を使用できますdownload.file("url", "destinationFileName.csv")
。
download.file( "// bit.ly/BostonSnowfallCSV"、 "BostonWinterSnowfalls.csv")
これは、システムがそのBit.ly URLショートカットからリダイレクトし、実際のファイルURL // raw.githubusercontent.com / smach / NICAR15data / master / BostonWinterSnowfalls.csvを正常に見つけることを前提としています。古いWindowsPCでWebコンテンツにアクセスする際に問題が発生することがあります。それらのいずれかがあり、このBit.lyリンクが機能しない場合は、実際のURLをBit.lyリンクに置き換えることができます。もう1つのオプションは、可能であればWindowsPCをWindows10にアップグレードして、それでうまくいくかどうかを確認することです。
rioがURLから直接データをインポートできるようにしたい場合は、実際にインポートできます。次のセクションで説明します。このセクションのポイントは、ローカルファイルを操作する練習をすることです。
ローカルシステムにテストファイルを作成したら、次のコードを使用して、そのデータをsnowdataというRオブジェクトにロードできます。
snowdata <-rio :: import( "BostonWinterSnowfalls.csv")
rioがファイルをバイナリ形式で再ダウンロードするように要求する可能性があることに注意してください。その場合は、実行する必要があります。
download.file( "// bit.ly/BostonSnowfallCSV"、 "BostonWinterSnowfalls.csv"、mode = "wb")
RStudioのタブ補完オプションを必ず使用してください。入力rio::
して待つと、使用可能なすべての機能のリストが表示されます。入力snow
して待つと、オプションとしてオブジェクトのフルネームが表示されます。上下の矢印キーを使用して、オートコンプリートの候補間を移動します。必要なオプションが強調表示されたら、Tabキー(またはEnter)を押して、完全なオブジェクト名または関数名をスクリプトに追加します。
snowdata
RStudioの右上のペインの[環境]タブにオブジェクトが表示されます。(右上のペインに、環境ではなくコマンド履歴が表示されている場合は、[環境]タブを選択します。)

snowdata
76個の「obs」(観測値または行)と2つの変数(列)があることを示す必要があります。左側の矢印をクリックしてsnowdata
リストを展開すると、2つの列名と、各列が保持するデータのタイプが表示されます。Winter
文字列で、Total
列は数値です。また、[環境]ペインに各列の最初のいくつかの値が表示されるはずです。

snowdata
データをスプレッドシートのように表示するには、[環境]タブで単語自体をクリックします。コマンドを使用して、Rコンソールから同じビューを取得できます(ビューView(snowdata)
の大文字のVにview
する必要があります-機能しません)。注:環境内のRオブジェクトのsnowdata
名前を参照しているため、引用符で囲まれていません。rio::import
前のコマンドでBostonWinterSnowfalls.csv
は、Rオブジェクトではないため、引用符で囲んでいます。R以外のファイルの文字列名です。

このビューには、スプレッドシートのような動作がいくつかあります。列ヘッダーをクリックして、その列の値で昇順で並べ替えます。同じ列ヘッダーをもう一度クリックして、降順で並べ替えます。特定の文字に一致する行を見つけるための検索ボックスがあります。
[フィルター]アイコンをクリックすると、各列のフィルターが表示されます。Winter
文字列は、あなたが入力した文字を含むすべての行のフィルタリング、期待通りに動作します。あなたがクリックした場合Total
の数値列のフィルタ新しいものは、ヒストグラムやフィルタリングのためのボックスを表示しながら、しかし、RStudioの古いバージョンではスライダーを表示します。
Webからファイルをインポートする
Webからファイルをダウンロードしてインポートする場合は、ExcelやCSVなどの形式で公開されている場合に行うことができます。試してみてください
snowdata <-rio :: import( "// bit.ly/BostonSnowfallCSV"、format)
多くのシステムは、"csv"
ここでのファイル名にが含まれていないために形式を指定する限り、最初にエラーメッセージを表示した後でも、ファイルへのリダイレクトURLをたどることができます.csv
。うまくいかない場合は、代わりにURL // raw.githubusercontent.com / smach / R4JournalismBook / master / data / BostonSnowfall.csvを使用してください。
rioは、適切にフォーマットされたHTMLテーブルをWebページからインポートすることもできますが、テーブルは非常に適切にフォーマットされている必要があります。暴風雨に対する国立気象局の重大度評価を説明する表をダウンロードするとします。National Centers for Environmental Information Regional Snowfall Indexページには、非常に巧妙に作成されたテーブルが1つしかないため、次のようなコードが機能するはずです。
rsi_description <-rio :: import( "//www.ncdc.noaa.gov/snow-and-ice/rsi/"、format =" html ")
この場合、フォーマットを含める必要があることに再度注意してくださいformat="html"
。URL自体は、それがどのような種類のファイルであるかを示していないためです。URLに.html
拡張子が付いたファイル名が含まれている場合、rioはそれを認識します。
ただし、実際には、Webデータがこのようにきちんと分離された形式で表示されることはめったにありません。あまり巧妙に作成されていない場合に適したオプションは、多くの場合htmltabパッケージです。でインストールしinstall.packages("htmltab")
ます。HTMLテーブルを読み取るためのパッケージの関数は、htmltabとも呼ばれます。しかし、これを実行すると:
library(htmltab)citytable <-htmltab( "// en.wikipedia.org/wiki/List_of_United_States_cities_by_population")str(citytable)
データフレームに1つのオブジェクトが含まれているため、正しいテーブルがないことがわかります。どのテーブルを指定しなかったので、ページの最初のHTMLテーブルをプルしました。それは私が望むものではありませんでした。適切なテーブルが見つかるまで、ページ上のすべてのテーブルをインポートする気はありませんが、幸い、ページ上のテーブルのリストを表示できるTableCaptureというChrome拡張機能があります。
前回チェックしたとき、300行を超えるテーブル5が必要でした。それでも問題が解決しない場合は、ChromeブラウザにTable Captureをインストールして、ダウンロードするテーブルを確認してください。
表5を指定して、新しい都市テーブルの列名を確認して、もう一度試してみます。次のコードでは、citytable <- htmltab()
コマンドを複数の行に配置していることに注意してください。そのため、余白を超えませんでした。すべてを1行にまとめることができます。この記事が掲載されてからテーブル番号が変更されている場合はwhich = 5
、正しい番号に置き換えてください。
ウィキペディアのページを使用する代わりに、ウィキペディアのURLを私が作成したファイルのコピーのURLに置き換えることができます。そのファイルは//bit.ly/WikiCityListにあります。そのバージョンを使用するbit.ly/WikiCityList
には、ブラウザに入力し、リダイレクト先の長いURLをコピーして、以下のコードのWikipediaURLの代わりに使用します。
library(htmltab)citytable <-htmltab( "// en.wikipedia.org/wiki/List_of_United_States_cities_by_population"、= 5)colnames(citytable)
which
テーブル番号を指定するために必要な引数が何であるかをどうやって知りましたか?htmltab
コマンドを使用してヘルプファイルを読みました?htmltab
。これには、利用可能なすべての引数が含まれていました。可能性をスキャンしたところ、「which
ドキュメント内のテーブルを識別するための長さ1のベクトル」が正しく見えました。
また、列名を表示するcolnames(citytable)
代わりに使用したことにも注意names(citytable)
してください。どちらでも動作します。ベースRにもrownames()
機能があり ます。
とにかく、これらのテーブルの結果ははるかに優れていますが、実行するstr(citytable)
と、数値であるはずのいくつかの列が文字列として入力されたことがわかります。これはchr
、列名の横と、などの値を囲む引用符の両方で確認できます8,550,405
。
これは、Rの小さな煩わしさの1つです。Rは通常、それ8,550
が数値であることを理解していません。私は自分のrmiscutilsパッケージに自分の関数を記述して、実際にはコンマ付きの数字であるすべての「文字列」を数字に戻すことで、この問題に自分で対処しました。誰でもGitHubからパッケージをダウンロードして使用できます。
GitHubからパッケージをインストールする最も一般的な方法は、devtoolsと呼ばれるパッケージを使用することです。devtoolsは、主に独自のパッケージを作成したい人のために設計された非常に強力なパッケージであり、CRAN以外の場所からパッケージをインストールするいくつかの方法が含まれています。ただし、devtoolsは通常、通常のパッケージと比較してインストールするためにいくつかの追加の手順を必要とし、絶対に必要になるまで煩わしいシステム管理タスクを残したいと思います。
ただし、pacmanパッケージは、GitHubなどの非CRANソースからのパッケージもインストールします。まだインストールしていない場合は、でpacmanをインストールしてくださいinstall.packages("pacman").
pacmanのp_install_gh("username/packagerepo")
関数はGitHubリポジトリからインストールされます。
p_load_gh("username/packagerepo")
ロードメモリへのパッケージには、それがすでにシステムに存在している場合、それは最初にインストールしたパッケージがローカルに存在しない場合にはGitHubからパッケージをロードします。
私のrmiscユーティリティパッケージはにありますsmach/rmiscutils
。実行pacman::p_load_gh("smach/rmiscutils")
してrmiscutilsパッケージをインストールします。
注:GitHubからパッケージをインストールするための代替パッケージはリモートと呼ばれ、を介してインストールできます install.packages("remotes")
。その主な目的は、GitHubなどのリモートリポジトリからパッケージをインストールすることです。ヘルプファイルはhelp(package="remotes")
。で見ることができます。
そして、おそらくすべての中で最も巧妙なのはgithubinstallと呼ばれるパッケージです。これは、パッケージが存在するリポジトリを推測することを目的としています。経由でインストールし install.packages("githubinstall")
ます; 次に、を使用してrmiscutilsパッケージをインストールできます githubinstall::gh_install_packages("rmiscutils")
。パッケージをにインストールするかどうかを尋ねられますsmach/rmisutils
(インストールします)。
関数のコレクションをインストールしたので、number_with_commas()
関数を使用して、数字であるはずの文字列を数字に戻すことができます。既存の列を変更するのではなく、データフレームに新しい列を追加することを強くお勧めします。これは、使用しているプラットフォームに関係なく、優れたデータ分析手法です。
この例では、新しい列を呼び出しますPopEst2017
。(それ以降にテーブルが更新されている場合は、適切な列名を使用してください。)
ライブラリ(rmiscutils)citytable $ PopEst2017 <-number_with_commas(citytable $ `2017見積もり`)
ちなみに、私のrmiscutilsパッケージは、コンマを含むインポートされた数値を処理する唯一の方法ではありません。rmiscutilsパッケージとそのnumber_with_commas()
機能を作成した後、tidyversereaderパッケージが誕生しました。readrには、文字列を数字に変換する関数も含まれていますparse_number()
。
リーダーをインストールした後、リーダーを使用して2017年の見積もり列から数値を生成できます。
citytable $ PopEst2017 <-readr :: parse_number(citytable $ `2017見積もり`)
利点の1つreadr::parse_number()
は、locale()
エンコードや小数点などを制御するために独自に定義できることです。これは、米国を拠点としない読者にとって興味深いものです。?parse_numbe
詳細については、rを実行してください。
注:2017年の見積もり列にタブ補完を使用しなかった場合、このコードの実行時に列名にスペースが含まれていると、その列名に問題が発生した可能性があります。上記の私のコードでは`
、列名の前後に後方の一重引用符()があることに注意してください。これは、既存の名前にスペースが含まれているためです。これは、Rにはないはずです。その列名には、別の問題があります。数字で始まり、通常はRのno-noです。 RStudioはこれを認識しており、タブオートコンプリートを使用して名前の前後に必要な逆引用符を自動的に追加します。
ボーナスのヒント:管理人と呼ばれるRパッケージ(もちろんあります!)があります。これは、Rに対応していないデータソースからインポートされた厄介な列名を自動的に修正できます。でインストールしinstall.packages("janitor")
ます。次に、管理人のclean_names()
関数を使用して、新しいクリーンな列名を作成できます。
ここで、元のデータフレームの列名を変更する代わりに、まったく新しいデータフレームを作成し、元のデータに対して管理人のclean_names()を実行します。次に、データフレームの列名をnames()
次のように確認します。
citytable_cleaned <-janitor :: clean_names(citytable)名前(citytable_cleaned)
スペースがアンダースコアに変更されていることがわかります。これは、R変数名で有効です(ピリオドも同様です)。また、以前は数字で始まっていたすべての列名の先頭にが付いていx
ます。
本質的に同じデータのコピーを2つ持つことでメモリを浪費したくない場合は、rm()
関数を使用して作業セッションからRオブジェクトを削除できます rm(citytable)
。
パッケージからデータをインポートする
Rから直接データにアクセスできるパッケージがいくつかあります。1つはquantmodで、これを使用すると、米国政府および財務データの一部をRに直接取り込むことができます。
もう1つは、CRANの適切な名前のweatherdataパッケージです。世界中の多くの国の情報を含むWeatherUndergroundAPIからデータを取得できます。
rOpenSciグループのプロジェクトであるrnoaaパッケージは、毎日の気候、ブイ、暴風雨の情報など、いくつかの異なる米国海洋大気庁のデータセットを利用します。
米国またはカナダの州または地方自治体のデータに関心がある場合は、RSocrataをチェックして、関心のある機関がそこにデータを投稿しているかどうかを確認することをお勧めします。利用可能なすべてのSocrataデータセットの完全なリストはまだ見つかりませんが、// www.opendatanetwork.comに検索ページがあります。ただし、注意が必要です。コミュニティでアップロードされたセットと政府の公式データがあるため、Rの実践以上に信頼する前に、データセットの所有者とアップロードソースを確認してください。結果の「ODNデータセット」は、一般の人がアップロードしたファイルであることを意味します。政府の公式データセットは、//data.CityOrStateName.gov
やの ようなURLに存在する傾向があります//data.CityOrStateName.us
。
その他のデータインポートパッケージについては、// bit.ly/RDataPkgsにある検索可能なグラフを参照してください。米国政府のデータを使用する場合は、米国国勢調査局のデータを利用するcensusapiとtidycensusに特に関心があるかもしれません。その他の有用な政府データパッケージには、両方の地域のデータを簡単に比較できるようにするための米国および欧州連合政府のeu.us.opendata、およびカナダの国勢調査データのカンセンサスが含まれます。
データが理想的にフォーマットされていない場合
これらすべてのサンプルデータの場合、データは適切にフォーマットされているだけでなく、理想的です。一度見つけたら、R用に完全に構造化されています。それはどういう意味ですか?それは長方形であり、各セルはマージされたセルではなく単一の値を持っていました。また、最初の行には列ヘッダーがありましたが、たとえば、見栄えを良くするために複数のセルにまたがる大きなフォントのタイトル行があるか、列ヘッダーがまったくありませんでした。
乱雑なデータの処理は、残念ながらかなり複雑になる可能性があります。ただし、簡単に修正できる一般的な問題がいくつかあります。
データの一部ではない開始行。Excelスプレッドシートの最初の数行に必要なデータがないことがわかっている場合は、rioに1行以上スキップするように指示できます。構文はrio::import("mySpreadsheet.xlsx", skip=3)
、最初の3行を除外することです。skip
整数を取ります。
スプレッドシートに列名はありません。デフォルトのインポートでは、シートの最初の行が列名であると想定しています。データにヘッダーがない場合、データの最初の行が列ヘッダーになる可能性があります。これを回避するにはrio::import("mySpreadsheet.xlsx", col_names = FALSE)
、RがX0、X1、X2などのデフォルトヘッダーを生成するように使用します。または、などの構文を使用しrio::import("mySpreadsheet.xlsx", col_names = c("City", "State", "Population"))
て独自の列名を設定します。
スプレッドシートに複数のタブがある場合、which
引数は最初のワークシートのデフォルトの読み取り値を上書きします。rio::import("mySpreadsheet.xlsx", which = 2)
2番目のワークシートを読み取ります。
データフレームとは何ですか?そして、あなたはそれで何ができますか?
rioは、スプレッドシートまたはCSVファイルをRデータフレームとしてインポートします。データフレームがあるかどうかはどうやってわかりますか?以下の場合にはsnowdata
、class(snowdata)
それはオブジェクトのクラス、またはタイプを返します。str(snowdata)
また、クラスを教えて、もう少し情報を追加します。表示される情報の多くは、str()
RStudio環境ペインでこの例に表示されたものと似ています。76個のsnowdata
観測値(行)と2つの変数(列)があります。
データフレームは、列と行があるという点でスプレッドシートに似ています。ただし、データフレームはより構造化されています。データフレームの各列はRベクトルです。つまり、列のすべての項目は同じデータ型である必要があります。 1つの列をすべて数値にし、別の列をすべて文字列にすることができますが、列内ではデータの一貫性が必要です。
値が5、7、4、および「今後の値」のデータフレーム列がある場合、Rは単に不満を感じるだけでなく、エラーが発生します。代わりに、すべての値を同じデータ型に強制変換します。「値が来て、」そのため数に変えることができない、5、7、および4は、の文字列に変換されてしまいます"5"
、"7"
と"4"
。これは通常、必要なものではないため、各列にどのタイプのデータがあるかを知っておくことが重要です。1,000個の数字の列にある1つの漂遊文字列値は、全体を文字に変換できます。数字が必要な場合は、必ず持ってください。
Rには、残りの列を台無しにしない欠落データを参照する方法がNA
あります。つまり、「利用できない」という意味です。
データフレームは長方形です。各行には同じ数のエントリが必要であり(一部は空白にすることもできます)、各列には同じ数の項目が必要です。
Excelスプレッドシートの列は通常、列A、列Bなどの文字で参照されますdataFrameName$columnName
。構文を使用して、データフレーム列をその名前で参照できます。したがって、snowdata$Total
入力してEnterキーを押すと、次Total
の図に示すように、列にすべての値が表示されます。(そのため、str(snowdata)
コマンドを実行すると、各列の名前の前にドル記号が表示されます。)

リストの左側にある括弧で囲まれた数字はデータの一部ではないことに注意してください。データの各行がどの位置から始まるかを示しているだけです。[1]
行がベクトルの最初の項目[10]
、10番目などで始まることを意味します。
RStudioタブ補完は、データフレームの列名だけでなく、オブジェクト名と関数名でも機能します。これは、列名のつづりを間違えてスクリプトを壊さないようにするために非常に便利です。また、長い列名がある場合は入力を節約できます。
入力snowdata$
して待つと、snowdataのすべての列名のリストが表示されます。
データフレームに列を追加するのは簡単です。現在、Total
列には冬の降雪量がインチ単位で表示されています。合計をメートルで表示する列を追加するには、次の形式を使用できます。
snowdata $ Meters <-snowdata $ Total * 0.0254
新しい列の名前は左側にあり、式は右側にあります。Excelでは=A2 * 0.0254
、数式を使用して列にコピーした可能性があります。スクリプトを使用すると、列のすべての値に数式が適切に適用されているかどうかを心配する必要はありません。
次にsnowdata
、[環境]タブでオブジェクトを確認します。3番目の変数が必要Meters
です。
snowdata
はデータフレームであるため、コマンドラインからアクセスできる特定のデータフレームプロパティがあります。nrow(snowdata)
行ncol(snowdata)
数と列数を示します。はい、これをRStudio環境で表示して、観測値と変数の数を確認できますが、スクリプトの一部としてこれを知りたい場合があります。colnames(snowdata)
またはnames(snowdata)
、snowdata
列の名前を指定します。rownames(snowdata)
行名を指定します(何も設定されていない場合は、デフォルトで行番号の文字列"1", "2", "3",
などになります)。
メソッドとも呼ばれるこれらの特別なデータフレーム関数のいくつかは、情報を提供するだけでなく、データフレームの特性を変更することもできます。したがって、names(snowdata)
データフレームの列名はわかりますが、
names(snowdata)<-c( "Winter"、 "SnowInches"、 "SnowMeters")
データフレームの列名を変更します。
データフレームオブジェクトで使用可能なすべてのメソッドを知る必要はないかもしれませんが、興味がある場合methods(class=class(snowdata))
はそれらを表示します。メソッドの詳細を確認するには、?merge
またはなどの疑問符を付けて通常のヘルプクエリを実行します?subset
。
数が実際には数ではない場合
郵便番号は、実際にはそのように扱われるべきではない「数字」の良い例です。技術的には数値ですが、2つの郵便番号を一緒に追加したり、コミュニティ内の郵便番号の平均をとったりすることは意味がありません。郵便番号の列をインポートすると、Rはそれを数字の列に変換する可能性があります。また、郵便番号が0で始まるニューイングランドの地域を扱っている場合、0は消えます。
マサチューセッツ州政府機関からダウンロードした、近所ごとのボストンの郵便番号のタブ付きファイルがあります。//raw.githubusercontent.com/smach/R4JournalismBook/master/data/bostonzips.txtにあります。でインポートしようとするとzips <- rio::import("bostonzips.txt")
、郵便番号は02118、02119などではなく、2118、2119などとして入力されます。
ここで、rioの import()
関数が使用する基になる関数について少し知ることが役立ちます。これらの基礎となる関数は、のimport
ヘルプファイルを読むことで見つけることができます?import
。タブ区切りのファイルを取り込むには、data.tableパッケージまたはベースRの関数からimport
使用します。ヘルプには、あなたが列クラスを指定することができると言うの引数。fread()
read.table()
?read.table
colClasses
現在のプロジェクトディレクトリにデータサブディレクトリを作成し、bostonzips.txtファイルをダウンロードします。
download.file( "// raw.githubusercontent.com/smach/R4JournalismBook/master/data/bostonzips.txt"、 "data / bostonzips.txt")
両方の列を文字列として指定してこのファイルをインポートすると、郵便番号は適切にフォーマットされます。
zips <-rio :: import( "data / bostonzips.txt"、colClasses = c( "character" "、" character "))str(zips)
列クラスは、c()
関数、を使用して設定する必要があることに注意してくださいc("character", "character")
。試してみるとcolClasses, "character"
、エラーメッセージが表示されます。これはR初心者にとって典型的なエラーですが、c()
習慣に入るのにそれほど時間はかからないはずです。
自分で入力するためのヒント:c("character", "character")
書き出すのはそれほど難しいことではありません。ただし、最初の14列を文字列にする必要がある16列のスプレッドシートがある場合、これは煩わしいものになる可能性があります。Rのrep()
関数が役立ちます。rep()
、ご想像のとおり、フォーマットを使用して、指定したアイテムを何度でも繰り返しますrep(myitem, numtimes)
。rep("character", 2)
はと同じなのでc("character", "character")
、colClasses = rep("character", 2)
と同等colClasses = c("character", "character")
です。そして、colClasses = c(rep("character", 14), rep("numeric", 2))
最初の14列を文字列として設定し、最後の2列を数字として設定します。名前は文字列であるため、ここでの列クラスの名前はすべて引用符で囲む必要があります。
rep()
他のR関数も使用する構文なので、フォーマットに慣れるために少し遊んでみることをお勧めします。
簡単なサンプルデータ
Rには、新しい関数やその他のプログラミング手法を試してみたい場合に使いやすい組み込みのデータセットがいくつか付属しています。インストラクターは、すべての生徒がまったく同じ形式の同じデータから始めていることを確認できるため、Rを教える人々にもよく使用されます。
入力data()
して、ベースRで使用可能な組み込みデータセットと、現在ロードされているインストール済みパッケージを確認します。data(package = .packages(all.available = TRUE))
from base Rは、現在の作業セッションでメモリにロードされているかどうかに関係なく、システムにインストールされているパッケージからのすべての可能なデータセットを表示します。
関数のヘルプを取得するのと同じ方法で、データセットに関する詳細情報を取得できます。?datasetname
またはhelp("datasetname")
。mtcarsとirisは、私がよく使用するものの1つです。
と入力するmtcars
と、mtcarsデータセット全体がコンソールに出力されます。このhead()
関数を使用して、。を使用して最初の数行を確認できますhead(mtcars)
。
必要に応じて、そのデータセットをcardata <- mtcars
。のような形式で別の変数に格納できます。
または、などのデータセット名を使用してデータ関数を実行すると、データセットがdata(mtcars)
作業環境にロードされます。
ジャーナリスト向けのサンプルデータセットを含む最も興味深いパッケージの1つは、FiveThirtyEight.comWebサイトで公開されたストーリーのデータを含むfivethirtyeightパッケージです。このパッケージは、FiveThirtyEightの編集者と相談して数人の学者によって作成されました。学部の統計を教えるためのリソースとなるように設計されています。
事前にパッケージ化されたデータは便利で、場合によっては楽しいものです。ただし、現実の世界では、非常に便利にパッケージ化されたデータを使用していない可能性があります。
Rで手動でデータフレームを作成する
多くの場合、Rの外部で始まるデータを処理し、スプレッドシート、CSVファイル、API、またはその他のソースからインポートします。ただし、少量のデータをRに直接入力したり、データフレームを手動で作成したりする場合もあります。それでは、それがどのように機能するかを簡単に見てみましょう。
Rデータフレームは、デフォルトでは、一度に1行ではなく、列ごとにアセンブルされます。町の選挙結果の簡単なデータフレームを作成したい場合は、候補者名のベクトル、政党の所属を示す2番目のベクトル、および投票総数のベクトルを作成できます。
候補<-c( "Smith"、 "Jones"、 "Write-ins"、 "Blanks")パーティー<-c( "Democrat"、 "Republican"、 ""、 "")
投票<-c(15248、16723、230、5234)
Excelの場合のように、数値にコンマを使用しないように注意してください。
これらの列からデータフレームを作成するには、data.frame()
関数とを使用しますsynatx data.frame(column1, column2, column3)
。
myresults <-data.frame(候補者、政党、投票)
構造を確認してくださいstr()
:
str(myresults)
候補者と政党のベクトルは文字ですが、候補者と政党のデータフレーム列は、因子と呼ばれるRオブジェクトのクラスに変換されています。現時点では、要素がキャラクターとどのように異なるかを掘り下げるには、少し雑草が多すぎます。
- 以下のようなあなたは、注文のグラフのための特定の、アルファベット以外の方法でアイテムや他の目的にしたい場合の要因が役立つことができ
Poor
未満であるFair
よりも小さいGood
未満ですExcellent
。 - 要因は、時々予想されるものとは異なる動作をする可能性があります。特に要素が必要な理由がない限り、文字列を使用することをお勧めします。
引数を追加することにより、データフレームを作成するときに文字列をそのまま維持できますstringsAsFactors = FALSE
。
myresults <-data.frame(candidates、party、votes、stringsAsFactors = FALSE)str(myresults)
これで、値は期待どおりになりました。
この方法でデータフレームを作成するときに警告する必要があるもう1つのことがあります。一方の列がもう一方の列よりも短い場合、Rは、それを実行するかどうかに関係なく、短い列からデータを繰り返すことがあります。
たとえば、候補者と政党の選挙結果列を作成したが、書き込みと空白ではなく、スミスとジョーンズの投票結果のみを入力したとします。データフレームに他の2つのエントリが空白として表示されることを期待するかもしれませんが、それは間違いです。2つの数字だけで新しい投票ベクトルを作成し、その新しい投票ベクトルを使用して別のデータフレームを作成することにより、試してみてください。
投票<-c(15248、16723)myresults2 <-data.frame(候補者、政党、投票)
str(myresults2)
そうです、Rは最初の2つの数字を再利用しましたが、これは間違いなくあなたが望むものではありません。投票ベクトルに2つまたは4つではなく、3つの数字を使用してこれを試行すると、Rはエラーをスローします。これは、各エントリを同じ回数リサイクルできなかったためです。
今までに、「文字列を因子に自動的に変更しないデータフレームを作成できないのはなぜですか?そして、すべてのデータを完成させるのを忘れた場合、なぜデータフレームが1つの列のデータを再利用することを心配しなければならないのですか?」ハドリーウィッカムも同じ考えを持っていました。彼のtibbleパッケージは、tibbleとも呼ばれるRクラスを作成します。これは、「データフレームの最新のテイク」であると彼は言います。彼らは、時の試練に耐えてきた機能を維持し、以前は便利でしたが現在はイライラしている機能を削除します。」
これが気になる場合は、システムにない場合はtibbleパッケージをインストールしてから、でtibbleを作成してみてください。
myresults3 <-tibble :: tibble(候補者、政党、投票)
投票列の長さは44アイテムまたは1アイテムのいずれかである必要があるというエラーメッセージが表示されます(1つのアイテムtibble()
を必要な回数繰り返しますが、1つのアイテムのみです)。
このデータを使用して投票を作成する場合は、投票列を4つのエントリに戻します。
ライブラリ(tibble)投票<-c(15248、16723、230、5234)
myresults3 <-tibble(候補者、政党、投票)
str(myresults3)
これはデータフレームに似ています。実際にはデータフレームですが、印刷方法など、いくつかの特別な動作があります。また、候補列は要素ではなく文字列であることに注意してください。
この動作が気に入った場合は、先に進んでチブルを使用してください。ただし、従来のデータフレームがRにどのように残っているかを考えると、デフォルトの動作について知ることは依然として重要です。
データのエクスポート
多くの場合、Rでデータをラングリングした後、結果を保存する必要があります。私が最もよく使用するデータをエクスポートする方法のいくつかを次に示します。
CSVファイルに保存するとrio::export(myObjectName, file="myFileName.csv")
してとExcelファイルへ rio::export(myObjectName, file="myFileName.xlsx")
。rioは、ファイル名の拡張子に基づいて、必要なファイル形式を理解します。.tsv
タブ区切りのデータ、.json
JSON、.xml
XMLなど、他にもいくつかの利用可能な形式があります。
将来のセッションでRに簡単にロードできるようにRバイナリオブジェクトに保存します。2つのオプションがあります。
Genericsave()
は、1つ以上のオブジェクトをsave(objectName1, objectName2, file="myfilename.RData")
。などのファイルに保存します。このデータをRに読み戻すには、コマンドload("myfilename.RData")
を使用するだけで、すべてのオブジェクトが以前と同じ状態で同じ名前で返されます。
単一のオブジェクトをsaveRDS(myobject, file="filename.rds")
。を使用してファイルに保存することもできます。論理的な仮定は、loadRDSがファイルを読み戻すというものですが、代わりにコマンドはreadRDS
—この場合、オブジェクト名ではなく、データのみが保存されています。したがって、データをなどの新しいオブジェクト名に読み込む必要がありますmydata <- readRDS("filename.rds")
。
R専用のRオブジェクトを保存する3番目の方法があります。それは、オブジェクトの代わりにオブジェクトを再作成して最終結果を得るRコマンドを生成することです。オブジェクトを再作成するためのRファイルを生成するための基本R関数はdput()
またはdump()
です。しかし、私はrio::export(myobject, "mysavedfile.R")
さらに覚えやすいと思います。
最後に、読みやすさ、速度、または圧縮を最適化するファイルを保存する追加の方法があります。これについては、この記事の最後にある追加のリソースのセクションで説明します。
rio:を使用して、RオブジェクトをWindowsまたはMacクリップボードにエクスポートすることもできますrio::export(myObjectName, format)
。また、同じ方法でクリップボードからRにデータをインポートできますrio::import(file)
。
ボーナス:rioのconvert()
関数を使用すると、ご想像のとおり、データをRに手動でプルしたり、Rからプルしたりすることなく、あるファイルタイプを別のファイルタイプに変換できます。詳細については?convert
、を参照してください。
最後のポイント:RStudioを使用すると、コードをまったく記述しなくても、クリックしてファイルをインポートできます。インポートの背後にあるコードを理解することが重要だと思うので、コマンドラインからのインポートに慣れるまで、これはお勧めしません。しかし、これは便利なショートカットになる可能性があることを認めます。
RStudioの右下のペインの[ファイル]タブで、インポートするファイルに移動してクリックします。ファイルを表示するか、データセットをインポートするオプションが表示されます。[データセットのインポート]を選択すると、データをプレビューし、データのインポート方法を変更し、生成されるコードをプレビューするダイアログが表示されます。
必要な変更を加えて[インポート]をクリックすると、データがRにプルされます。
追加のリソース
リオの選択肢。rioはファイル処理の優れたスイスアーミーナイフですが、データをRに取り込む方法、またはRから保存する方法をもう少し制御したい場合があります。さらに、私が挑戦したこともあります。 rioが窒息したが、別のパッケージがそれを処理できるデータファイル。あなたが探求したいと思うかもしれない他のいくつかの関数とパッケージ:
- ベースR
read.csv()
とread.table()
テキストファイルのインポート(?read.csv
および?read.table
を使用して詳細情報を取得します)。stringsAsFactors = FALSE
文字列を文字列として保持したい場合は、これらで必要です。write.csv()
CSVに保存します。 - rioは、Excelファイルの読み取りにHadleyWickhamのreadxlパッケージを使用します。Excelのもう1つの代替手段は、openxlsxです。これは、Excelファイルへの書き込みと読み取りが可能です。エクスポート時にスプレッドシートをフォーマットする方法については、openxlsxパッケージのビネットをご覧ください。
- ウィッカムのリーダーパッケージも「tidyverse」の一部として一見の価値があります。readrには、CSV、タブ区切り、固定幅、Webログ、およびその他のいくつかのタイプのファイルを読み取る機能が含まれています。リーダーは、各列について決定したデータのタイプ(整数、文字、倍精度浮動小数点数(整数以外)など)を出力します。これにより、チブルが作成されます。
Googleスプレッドシートから直接インポートします。 googlesheetsパッケージを使用すると、Googleアカウントを認証することで、プライベートであっても、Googleスプレッドシートからデータをインポートできます。パッケージはCRANで入手できます。を介してインストールし install.packages("googlesheets")
ます。をロードした後library("googlesheets")
、優れた入門ビネットをお読みください。この記事の執筆時点では、イントロビネットはRで利用可能でしたvignette("basic-usage", package="googlesheets"
)。表示されない場合はhelp(package="googlesheets")
、ユーザーガイド、パッケージビネット、その他のドキュメントのリンクをクリックして利用可能なビネットを探すか、GitHub(// github.com/jennybc/googlesheets)のパッケージ情報を確認してください。
rvestパッケージとSelectorGadgetブラウザー拡張機能またはJavaScriptブックマークレットを使用してWebページからデータをスクレイピングします。 SelectorGadgetは、HTMLページにあるコピーするデータのCSS要素を見つけるのに役立ちます。次に、rvestはRを使用してそのデータを検索して保存します。これは生の初心者向けのテクニックではありませんが、Rの経験を積んだら、戻ってこれを再検討することをお勧めします。 //bit.ly/Rscrapingでこれを行う方法に関するいくつかの説明とビデオがあります。 RStudioには、オンデマンドで利用できるウェビナーもあります。
ベースRの保存および読み取り関数の代替。大規模なデータセットを使用している場合は、ファイルを保存およびロードするときに速度が重要になることがあります。 data.tableパッケージには高速なfread()
機能がありますが、結果のオブジェクトはdata.tablesであり、プレーンなデータフレームではないことに注意してください。一部の動作は異なります。従来のデータフレームが必要な場合は、as.data.frame(mydatatable)
構文を使用して取得できます。 data.tableパッケージのfwrite()
関数は、ベースRよりもかなり高速にCSVファイルに書き込むことを目的としていますwrite.csv()
。
他の2つのパッケージは、データの保存と取得に役立つ可能性があります。フェザーパッケージは、RまたはPythonのいずれかに読み取ることができるバイナリ形式で保存されます。そして、FSTパッケージのread.fst()
とwrite.fst()
オファーは、高速保存とRのデータフレームオブジェクトプラスファイル圧縮のオプションのロード。