<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>R | Democratizing Data</title><link>https://b94feae1.chezo-uno.pages.dev/categories/r/</link><atom:link href="https://b94feae1.chezo-uno.pages.dev/categories/r/index.xml" rel="self" type="application/rss+xml"/><description>R</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><copyright>© Aki Ariga 2017-2025</copyright><lastBuildDate>Wed, 04 Dec 2019 00:00:00 +0900</lastBuildDate><image><url>https://b94feae1.chezo-uno.pages.dev/media/icon_hu_9ca82a90e0d162db.png</url><title>R</title><link>https://b94feae1.chezo-uno.pages.dev/categories/r/</link></image><item><title>RとTreasure Data</title><link>https://b94feae1.chezo-uno.pages.dev/post/2019-12-04-r-and-td/</link><pubDate>Wed, 04 Dec 2019 00:00:00 +0900</pubDate><guid>https://b94feae1.chezo-uno.pages.dev/post/2019-12-04-r-and-td/</guid><description>&lt;p>この記事は、&lt;a href="https://adventar.org/calendars/3932" target="_blank" rel="noopener">Arm Treasure Data advent calendar&lt;/a> 3日目です。&lt;/p>
&lt;p>公式ドキュメントは、 &lt;a href="https://support.treasuredata.com/hc/en-us/articles/360001487927-R-Language-Driver-Install" target="_blank" rel="noopener">Rについてはあまり書かれていない&lt;/a>のですが、RからTreasureDataを使うにはRJDBC以外にもいくつかの方法があります。&lt;/p>
&lt;p>基本的には、RPrestoとRTDをおさえておくのが良いでしょう。&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/prestodb/RPresto" target="_blank" rel="noopener">RPresto&lt;/a>
&lt;ul>
&lt;li>Facebookが開発しているPrestoのR client。TreasureDataでもアドホックなクエリを投げるときに便利&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://github.com/treasure-data/RTD" target="_blank" rel="noopener">RTD&lt;/a>
&lt;ul>
&lt;li>Rからdata frameをTreasure Dataにアップロードするのに使えるR client&lt;/li>
&lt;li>(12/18追記) レポジトリの場所がtreasure-dataの下になりました&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://github.com/chezou/sparklytd" target="_blank" rel="noopener">sparklytd&lt;/a>
&lt;ul>
&lt;li>RStudio社が開発するRのSpark clientであるsparklyrのplugin&lt;/li>
&lt;li>内部で使うtd-sparkはSparkのサポートバージョンが上がるのが速いが、sparklyrのSparkの新バージョンサポートが遅いので少し低調なメンテナンス&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>実際の、RPrestoとRTDの使い方は以下のRmarkdownを見ていただくのが良いかと思います。
&lt;a href="https://rpubs.com/chezou/TD-from-RPresto-RTD" target="_blank" rel="noopener">https://rpubs.com/chezou/TD-from-RPresto-RTD&lt;/a>&lt;/p>
&lt;h1 id="rtdのインストール">RTDのインストール&lt;/h1>
&lt;p>インストールは、 &lt;code>devtools::install_github&lt;/code> を使うか、 &lt;code>install-github.me&lt;/code> を使うことでできます。&lt;/p>
&lt;p>RTDは v0.2.0 からCRANに上げるのを辞めました。これはこれで一つの記事が書けるのですがそれはまた別の機会に譲ろうと思います。&lt;/p>
&lt;p>余談ですが、CRANとの戦いの際にはr-wakalangの皆様に支えていただきました。Rに関する開発はもはやあそこなしには成り立ちません。&lt;a href="https://github.com/tokyor/r-wakalang" target="_blank" rel="noopener">Slack&lt;/a>にぜひ参加するといいと思います。パッケージングから統計モデリングも話まで物凄い勢いで有識者が答えてくれます。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-R" data-lang="R">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">source&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;https://install-github.me/treasure-data/RTD@v0.2.0&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>インストール後は、&lt;code>apikey&lt;/code> と &lt;code>endpoint&lt;/code> を適切なものを渡して上げることで、uploadができます。例えば &lt;code>nycflights13&lt;/code> パッケージの &lt;code>flights&lt;/code> データをアップロードしてみましょう。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-R" data-lang="R">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">RTD&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">client&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">Td&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">apikey&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">Sys.getenv&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;TD_API_KEY&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">endpoint&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;api.treasuredata.com&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">td_upload&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">client&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;test&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;flights&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">nycflights13&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">flights&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">overwrite&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="bp">T&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>v0.1.0 ではembulkが必須でしたが、今のバージョンは bulk import APIを使うようになっているため、特に追加でツールをインストールする必要はありません。&lt;/p>
&lt;h1 id="rprestoでの接続">RPrestoでの接続&lt;/h1>
&lt;p>&lt;code>src_presto&lt;/code> する際には、 &lt;code>user&lt;/code> に TDのAPI keyを渡すこと、hostは&lt;a href="https://support.treasuredata.com/hc/en-us/articles/360001474288-Sites-and-Endpoints#Endpoints" target="_blank" rel="noopener">こちらのendpoint&lt;/a>を参照してください。schemaはDatabase名、 catalogは &lt;code>td-presto&lt;/code>のままにしてください。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-R" data-lang="R">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">RPresto&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dplyr&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">db&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">src_presto&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">host&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;https://api-presto.treasuredata.com&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">port&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">443&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">user&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nf">Sys.getenv&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;TD_API_KEY&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">schema&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#39;test&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">catalog&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#39;td-presto&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">flights_tbl&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">tbl&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">db&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#39;flights&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>flights_tbl&lt;/code> にテーブルが変数として割り当てられました。が、実際にはdplyrの諸々の処理を実行するときにSQLが走るのでalias程度に考えてください。&lt;/p>
&lt;h1 id="dplyrとggplot2で可視化する">dplyrとggplot2で可視化する&lt;/h1>
&lt;p>それでは、 &lt;code>flights_tbl&lt;/code> をdplyrを使い集計して飛行機の平均遅延時間などを算出して、ggplot2で可視化してみましょう。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-R" data-lang="R">&lt;span class="line">&lt;span class="cl">&lt;span class="n">delay&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">flights_tbl&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">group_by&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tailnum&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">summarise&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">count&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">n&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="n">dist&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">mean&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">distance&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">na.rm&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">TRUE&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">delay&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">mean&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">arr_delay&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">na.rm&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">TRUE&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">count&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="m">20&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dist&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="m">2000&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">collect&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># plot delays&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ggplot2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ggplot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">delay&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nf">aes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dist&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">delay&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">geom_point&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">aes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">size&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">count&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">alpha&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="m">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">geom_smooth&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">scale_size_area&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>このような図ができたかと思います。&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="flex justify-center ">
&lt;div class="w-100" >&lt;img alt="" srcset="
/post/2019-12-04-r-and-td/rpresto_ggplot_hu_bf2a05aaa53d9f47.webp 400w,
/post/2019-12-04-r-and-td/rpresto_ggplot_hu_6cbc3cd7306f8ee1.webp 760w,
/post/2019-12-04-r-and-td/rpresto_ggplot_hu_749072726ec39129.webp 1200w"
src="https://b94feae1.chezo-uno.pages.dev/post/2019-12-04-r-and-td/rpresto_ggplot_hu_bf2a05aaa53d9f47.webp"
width="760"
height="543"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;p>それでは、HappyなRとTreasureDataライフを！&lt;/p></description></item></channel></rss>