<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>技术笔记 - 分类 - 灿若星河 | 郝建锋</title><link>https://philohao.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/</link><description>技术笔记 - 分类 - 灿若星河 | 郝建锋</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><managingEditor>haojianfeng1997@gmail.com (Jianfeng.Hao)</managingEditor><webMaster>haojianfeng1997@gmail.com (Jianfeng.Hao)</webMaster><lastBuildDate>Sat, 23 Jan 2021 15:16:59 +0800</lastBuildDate><atom:link href="https://philohao.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/index.xml" rel="self" type="application/rss+xml"/><item><title>数据库笔记 05 - SQL &amp; Pandas 对照学习</title><link>https://philohao.com/2021/01/20210123/</link><pubDate>Sat, 23 Jan 2021 15:16:59 +0800</pubDate><dc:creator>Jianfeng.Hao</dc:creator><author>haojianfeng1997@gmail.com (Jianfeng.Hao)</author><guid isPermaLink="true">https://philohao.com/2021/01/20210123/</guid><description>SQL 与 Pandas 对照学习笔记，整理分组统计、查询和数据处理思路。</description><content:encoded><![CDATA[<p>其实 MySQL 分组统计的实现原理，与 Pandas 几乎是一致的，只要我们理解了 Pandas 分组统计的实现原理，就能理解 MySQL 分组统计的原理。大体过程就是：</p>
<p><img
        class="lazyload"
        data-src="https://mmbiz.qpic.cn/mmbiz_png/tXYict40xfLh0Ik9K1kXOEAmHWbyyibhT8WZPbThsYdogwSV9SoX7nxGGCFXqlbBYtLtia7iaPuxUvZCgIt70DC0aA/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1"
        data-srcset="https://mmbiz.qpic.cn/mmbiz_png/tXYict40xfLh0Ik9K1kXOEAmHWbyyibhT8WZPbThsYdogwSV9SoX7nxGGCFXqlbBYtLtia7iaPuxUvZCgIt70DC0aA/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1, https://mmbiz.qpic.cn/mmbiz_png/tXYict40xfLh0Ik9K1kXOEAmHWbyyibhT8WZPbThsYdogwSV9SoX7nxGGCFXqlbBYtLtia7iaPuxUvZCgIt70DC0aA/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1 1.5x, https://mmbiz.qpic.cn/mmbiz_png/tXYict40xfLh0Ik9K1kXOEAmHWbyyibhT8WZPbThsYdogwSV9SoX7nxGGCFXqlbBYtLtia7iaPuxUvZCgIt70DC0aA/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1 2x"
        data-sizes="auto"
        alt="https://mmbiz.qpic.cn/mmbiz_png/tXYict40xfLh0Ik9K1kXOEAmHWbyyibhT8WZPbThsYdogwSV9SoX7nxGGCFXqlbBYtLtia7iaPuxUvZCgIt70DC0aA/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1"
        title="https://mmbiz.qpic.cn/mmbiz_png/tXYict40xfLh0Ik9K1kXOEAmHWbyyibhT8WZPbThsYdogwSV9SoX7nxGGCFXqlbBYtLtia7iaPuxUvZCgIt70DC0aA/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1"
    /></p>
<p><img
        class="lazyload"
        data-src="https://mmbiz.qpic.cn/mmbiz_png/tXYict40xfLh0Ik9K1kXOEAmHWbyyibhT8cmgPcjwI4lxovPHjckjjoJTuetcCibDDY7N4zhdDUCbUtmHH0oFBjmw/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1"
        data-srcset="https://mmbiz.qpic.cn/mmbiz_png/tXYict40xfLh0Ik9K1kXOEAmHWbyyibhT8cmgPcjwI4lxovPHjckjjoJTuetcCibDDY7N4zhdDUCbUtmHH0oFBjmw/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1, https://mmbiz.qpic.cn/mmbiz_png/tXYict40xfLh0Ik9K1kXOEAmHWbyyibhT8cmgPcjwI4lxovPHjckjjoJTuetcCibDDY7N4zhdDUCbUtmHH0oFBjmw/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1 1.5x, https://mmbiz.qpic.cn/mmbiz_png/tXYict40xfLh0Ik9K1kXOEAmHWbyyibhT8cmgPcjwI4lxovPHjckjjoJTuetcCibDDY7N4zhdDUCbUtmHH0oFBjmw/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1 2x"
        data-sizes="auto"
        alt="https://mmbiz.qpic.cn/mmbiz_png/tXYict40xfLh0Ik9K1kXOEAmHWbyyibhT8cmgPcjwI4lxovPHjckjjoJTuetcCibDDY7N4zhdDUCbUtmHH0oFBjmw/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1"
        title="https://mmbiz.qpic.cn/mmbiz_png/tXYict40xfLh0Ik9K1kXOEAmHWbyyibhT8cmgPcjwI4lxovPHjckjjoJTuetcCibDDY7N4zhdDUCbUtmHH0oFBjmw/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1"
    /></p>
<p>今天我将带大家从 <code>MYSQL</code> 的执行顺序（<strong>FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT</strong>）上，一步步通过 Pandas 向大家展示具体的执行过程，并借助 Python 基础编码，详解更细节的过程。</p>
<h2 id="mysql-分组统计的原理">MySQL 分组统计的原理</h2>
<p>其实上面给的示例代码等价于：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">SELECT
</span></span><span class="line"><span class="cl">  deal_date,
</span></span><span class="line"><span class="cl">  COUNT(IF(area= &#39;A区&#39;, order_id, NULL)) &#39;A区&#39;,
</span></span><span class="line"><span class="cl">  COUNT(IF(area= &#39;B区&#39;, order_id, NULL)) &#39;B区&#39;,
</span></span><span class="line"><span class="cl">  COUNT(IF(area= &#39;C区&#39;, order_id, NULL)) &#39;C区&#39;
</span></span><span class="line"><span class="cl">FROM
</span></span><span class="line"><span class="cl">  order_info
</span></span><span class="line"><span class="cl">GROUP BY deal_date;
</span></span></code></pre></td></tr></table>
</div>
</div><p>对于 mysql 标准的执行顺序是：</p>
<blockquote>
<p>FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT</p>
</blockquote>
<p>上面这个 sql 只涉及到 FROM → GROUP BY → SELECT ，可以调整一下 sql 的阅读顺序：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">FROM order_info
</span></span><span class="line"><span class="cl">GROUP BY deal_date
</span></span><span class="line"><span class="cl">SELECT
</span></span><span class="line"><span class="cl">  deal_date,
</span></span><span class="line"><span class="cl">  COUNT(IF(area= &#39;A区&#39;, order_id, NULL)) &#39;A区&#39;,
</span></span><span class="line"><span class="cl">  COUNT(IF(area= &#39;B区&#39;, order_id, NULL)) &#39;B区&#39;,
</span></span><span class="line"><span class="cl">  COUNT(IF(area= &#39;C区&#39;, order_id, NULL)) &#39;C区&#39;;
</span></span></code></pre></td></tr></table>
</div>
</div><ol>
<li>FROM</li>
</ol>
<p>首先<code>FROM order_info</code>表示读取 order_info 表的数据</p>
<ol>
<li>GROUP BY</li>
</ol>
<p><code>GROUP BY deal_date</code>表示按照 deal_date 分组</p>
<ol>
<li>SELECT</li>
</ol>
<p>对每个分组选取指定的字段，并根据聚合函数对每个分组结果进行集合</p>
<h2 id="pandas-分组统计的过程">Pandas 分组统计的过程</h2>
<h3 id="from">From</h3>
<p><code>FROM order_info</code>本质就是读取数据：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">import pandas as pd
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">data = pd.read_csv(&#34;data.csv&#34;, encoding=&#34;gb18030&#34;)
</span></span><span class="line"><span class="cl">data
</span></span></code></pre></td></tr></table>
</div>
</div><p>结果：</p>
<table>
<thead>
<tr>
<th style="text-align:center"></th>
<th style="text-align:center">order_id</th>
<th style="text-align:center">price</th>
<th style="text-align:center">deal_date</th>
<th style="text-align:center">area</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">0</td>
<td style="text-align:center">S001</td>
<td style="text-align:center">10</td>
<td style="text-align:center">2019/1/1</td>
<td style="text-align:center">A 区</td>
</tr>
<tr>
<td style="text-align:center">1</td>
<td style="text-align:center">S002</td>
<td style="text-align:center">20</td>
<td style="text-align:center">2019/1/1</td>
<td style="text-align:center">B 区</td>
</tr>
<tr>
<td style="text-align:center">2</td>
<td style="text-align:center">S003</td>
<td style="text-align:center">30</td>
<td style="text-align:center">2019/1/1</td>
<td style="text-align:center">C 区</td>
</tr>
<tr>
<td style="text-align:center">3</td>
<td style="text-align:center">S004</td>
<td style="text-align:center">40</td>
<td style="text-align:center">2019/1/2</td>
<td style="text-align:center">A 区</td>
</tr>
<tr>
<td style="text-align:center">4</td>
<td style="text-align:center">S005</td>
<td style="text-align:center">10</td>
<td style="text-align:center">2019/1/2</td>
<td style="text-align:center">B 区</td>
</tr>
<tr>
<td style="text-align:center">5</td>
<td style="text-align:center">S006</td>
<td style="text-align:center">20</td>
<td style="text-align:center">2019/1/2</td>
<td style="text-align:center">C 区</td>
</tr>
<tr>
<td style="text-align:center">6</td>
<td style="text-align:center">S007</td>
<td style="text-align:center">30</td>
<td style="text-align:center">2019/1/3</td>
<td style="text-align:center">A 区</td>
</tr>
<tr>
<td style="text-align:center">7</td>
<td style="text-align:center">S008</td>
<td style="text-align:center">40</td>
<td style="text-align:center">2019/1/3</td>
<td style="text-align:center">C 区</td>
</tr>
</tbody>
</table>
<p>对于 Mysql 的任何 InnoDB 引擎表来说都存在一个主键索引，在没有指定任何字段作为主键时，InnoDB 表会生成一个 6 字节空间的自增主键 row_id 作为主键。上面的 Pandas 表的 Index(<code>data.index</code>)就相当于 mysql 表的自增主键 row_id。</p>
<p>当然这张 MySQL 表指定 order_id 为主键时：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">ALTER TABLE order_info ADD PRIMARY KEY (order_id);
</span></span></code></pre></td></tr></table>
</div>
</div><p>就相当于：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">data.set_index(&#34;order_id&#34;)
</span></span></code></pre></td></tr></table>
</div>
</div><p>结果：</p>
<p><img
        class="lazyload"
        data-src="https://mmbiz.qpic.cn/mmbiz_png/tXYict40xfLh0Ik9K1kXOEAmHWbyyibhT8IPXHG6u09oiaxiclQf5Bnw7PPh21qmHEUhf2qhlXYj1MtxFdeX2AsYXQ/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1"
        data-srcset="https://mmbiz.qpic.cn/mmbiz_png/tXYict40xfLh0Ik9K1kXOEAmHWbyyibhT8IPXHG6u09oiaxiclQf5Bnw7PPh21qmHEUhf2qhlXYj1MtxFdeX2AsYXQ/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1, https://mmbiz.qpic.cn/mmbiz_png/tXYict40xfLh0Ik9K1kXOEAmHWbyyibhT8IPXHG6u09oiaxiclQf5Bnw7PPh21qmHEUhf2qhlXYj1MtxFdeX2AsYXQ/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1 1.5x, https://mmbiz.qpic.cn/mmbiz_png/tXYict40xfLh0Ik9K1kXOEAmHWbyyibhT8IPXHG6u09oiaxiclQf5Bnw7PPh21qmHEUhf2qhlXYj1MtxFdeX2AsYXQ/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1 2x"
        data-sizes="auto"
        alt="https://mmbiz.qpic.cn/mmbiz_png/tXYict40xfLh0Ik9K1kXOEAmHWbyyibhT8IPXHG6u09oiaxiclQf5Bnw7PPh21qmHEUhf2qhlXYj1MtxFdeX2AsYXQ/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1"
        title="图片"
    /></p>
<h3 id="group-by">GROUP BY</h3>
<p><code>GROUP BY deal_date</code>表示按照 deal_date 分组，即：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">df_group = data.groupby(&#34;deal_date&#34;)
</span></span><span class="line"><span class="cl">df_group
</span></span></code></pre></td></tr></table>
</div>
</div><p>结果：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">&lt;pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000000016CE8278&gt;
</span></span></code></pre></td></tr></table>
</div>
</div><p>其实这步的本质是获取每个分组对应的主键 id 列表，可以通过<code>DataFrameGroupBy</code>对象的<code>groups</code>方法查看：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">df_group.groups
</span></span></code></pre></td></tr></table>
</div>
</div><p>结果：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">{&#39;2019/1/1&#39;: [0, 1, 2], &#39;2019/1/2&#39;: [3, 4, 5], &#39;2019/1/3&#39;: [6, 7]}
</span></span></code></pre></td></tr></table>
</div>
</div><p>Pandas 返回的是每个分组对应的索引列表，它等价于 MySQL 的主键 id 列表。</p>
<h3 id="select">SELECT</h3>
<p>我们拿到每个分组对应的索引列表后，就可以拿到每个分组对应的全部数据：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">for deal_date, ids in df_group.groups.items():
</span></span><span class="line"><span class="cl">    print(deal_date)
</span></span><span class="line"><span class="cl">    display(data.loc[ids])
</span></span></code></pre></td></tr></table>
</div>
</div><p>结果：</p>
<p><img
        class="lazyload"
        data-src="https://mmbiz.qpic.cn/mmbiz_png/tXYict40xfLh0Ik9K1kXOEAmHWbyyibhT8xCzx6goic3G7vdOntZYBVPBmsE5MSiaxice8Yic9jQ33IoJU43u0WFInTA/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1"
        data-srcset="https://mmbiz.qpic.cn/mmbiz_png/tXYict40xfLh0Ik9K1kXOEAmHWbyyibhT8xCzx6goic3G7vdOntZYBVPBmsE5MSiaxice8Yic9jQ33IoJU43u0WFInTA/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1, https://mmbiz.qpic.cn/mmbiz_png/tXYict40xfLh0Ik9K1kXOEAmHWbyyibhT8xCzx6goic3G7vdOntZYBVPBmsE5MSiaxice8Yic9jQ33IoJU43u0WFInTA/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1 1.5x, https://mmbiz.qpic.cn/mmbiz_png/tXYict40xfLh0Ik9K1kXOEAmHWbyyibhT8xCzx6goic3G7vdOntZYBVPBmsE5MSiaxice8Yic9jQ33IoJU43u0WFInTA/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1 2x"
        data-sizes="auto"
        alt="https://mmbiz.qpic.cn/mmbiz_png/tXYict40xfLh0Ik9K1kXOEAmHWbyyibhT8xCzx6goic3G7vdOntZYBVPBmsE5MSiaxice8Yic9jQ33IoJU43u0WFInTA/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1"
        title="图片"
    /></p>
<p>当然，由于 Pandas 本身有现成的 API，我们实际并不会这样遍历每个分区，而是：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">for deal_date, split in df_group:
</span></span><span class="line"><span class="cl">    print(deal_date)
</span></span><span class="line"><span class="cl">    display(split)
</span></span></code></pre></td></tr></table>
</div>
</div><p>这段 Pandas 遍历每个分区的本质就是上面的代码，返回结果也与上面完全相同。</p>
<p>对于 MySQL 的 select 这步：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">SELECT
</span></span><span class="line"><span class="cl">  deal_date,
</span></span><span class="line"><span class="cl">  COUNT(IF(AREA= &#39;A区&#39;, 1, NULL)) &#39;A区&#39;,
</span></span><span class="line"><span class="cl">  COUNT(IF(AREA= &#39;B区&#39;, 1, NULL)) &#39;B区&#39;,
</span></span><span class="line"><span class="cl">  COUNT(IF(AREA= &#39;C区&#39;, 1, NULL)) &#39;C区&#39;
</span></span></code></pre></td></tr></table>
</div>
</div><p>由于前面分组的存在，<code>count()</code>聚合函数将作用于每一个分组，用 Pandas 表达就是：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">for deal_date, split in df_group:
</span></span><span class="line"><span class="cl">    split.loc[split.area == &#39;A区&#39;, &#39;A区&#39;] = split.order_id
</span></span><span class="line"><span class="cl">    split.loc[split.area == &#39;B区&#39;, &#39;B区&#39;] = split.order_id
</span></span><span class="line"><span class="cl">    split.loc[split.area == &#39;C区&#39;, &#39;C区&#39;] = split.order_id
</span></span><span class="line"><span class="cl">    split = split.set_index(&#39;deal_date&#39;)
</span></span><span class="line"><span class="cl">    split = split[[&#39;A区&#39;, &#39;B区&#39;, &#39;C区&#39;]]
</span></span><span class="line"><span class="cl">    display(split)
</span></span><span class="line"><span class="cl">    display(split.count().to_frame(deal_date).T)
</span></span></code></pre></td></tr></table>
</div>
</div><p>结果：</p>
<p><img
        class="lazyload"
        data-src="https://mmbiz.qpic.cn/mmbiz_png/tXYict40xfLh0Ik9K1kXOEAmHWbyyibhT8d5OLZYIWhZbSNFpOGk9oib0nvx0tCmm365ddanTpGelTD3TbbVA5PGA/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1"
        data-srcset="https://mmbiz.qpic.cn/mmbiz_png/tXYict40xfLh0Ik9K1kXOEAmHWbyyibhT8d5OLZYIWhZbSNFpOGk9oib0nvx0tCmm365ddanTpGelTD3TbbVA5PGA/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1, https://mmbiz.qpic.cn/mmbiz_png/tXYict40xfLh0Ik9K1kXOEAmHWbyyibhT8d5OLZYIWhZbSNFpOGk9oib0nvx0tCmm365ddanTpGelTD3TbbVA5PGA/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1 1.5x, https://mmbiz.qpic.cn/mmbiz_png/tXYict40xfLh0Ik9K1kXOEAmHWbyyibhT8d5OLZYIWhZbSNFpOGk9oib0nvx0tCmm365ddanTpGelTD3TbbVA5PGA/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1 2x"
        data-sizes="auto"
        alt="https://mmbiz.qpic.cn/mmbiz_png/tXYict40xfLh0Ik9K1kXOEAmHWbyyibhT8d5OLZYIWhZbSNFpOGk9oib0nvx0tCmm365ddanTpGelTD3TbbVA5PGA/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1"
        title="图片"
    /></p>
<h3 id="return">Return</h3>
<p>最后 MySQL 计算完成后，就会合并每个分组的结果集，用 Pandas 表达就是：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">result = []
</span></span><span class="line"><span class="cl">for deal_date, split in df_group:
</span></span><span class="line"><span class="cl">    split.loc[split.area == &#39;A区&#39;, &#39;A区&#39;] = split.order_id
</span></span><span class="line"><span class="cl">    split.loc[split.area == &#39;B区&#39;, &#39;B区&#39;] = split.order_id
</span></span><span class="line"><span class="cl">    split.loc[split.area == &#39;C区&#39;, &#39;C区&#39;] = split.order_id
</span></span><span class="line"><span class="cl">    split = split.set_index(&#39;deal_date&#39;)
</span></span><span class="line"><span class="cl">    split = split[[&#39;A区&#39;, &#39;B区&#39;, &#39;C区&#39;]]
</span></span><span class="line"><span class="cl">    result.append(split.count().to_frame(deal_date).T)
</span></span><span class="line"><span class="cl">result = pd.concat(result)
</span></span><span class="line"><span class="cl">result
</span></span></code></pre></td></tr></table>
</div>
</div><p>结果：</p>
<table>
<thead>
<tr>
<th style="text-align:center"></th>
<th style="text-align:center">A 区</th>
<th style="text-align:center">B 区</th>
<th style="text-align:center">C 区</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">2019/1/1</td>
<td style="text-align:center">1</td>
<td style="text-align:center">1</td>
<td style="text-align:center">1</td>
</tr>
<tr>
<td style="text-align:center">2019/1/2</td>
<td style="text-align:center">1</td>
<td style="text-align:center">1</td>
<td style="text-align:center">1</td>
</tr>
<tr>
<td style="text-align:center">2019/1/3</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
</tr>
</tbody>
</table>
<h2 id="pandas-分组聚合的执行过程">Pandas 分组聚合的执行过程</h2>
<p>对于上面完整 MySQL 语句，整体执行流程等价于 Pandas 的：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">def group_func(split):
</span></span><span class="line"><span class="cl">    split.loc[split.area == &#39;A区&#39;, &#39;A区&#39;] = split.order_id
</span></span><span class="line"><span class="cl">    split.loc[split.area == &#39;B区&#39;, &#39;B区&#39;] = split.order_id
</span></span><span class="line"><span class="cl">    split.loc[split.area == &#39;C区&#39;, &#39;C区&#39;] = split.order_id
</span></span><span class="line"><span class="cl">    split = split[[&#39;A区&#39;, &#39;B区&#39;, &#39;C区&#39;]]
</span></span><span class="line"><span class="cl">    return split.count()
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">data.groupby(&#39;deal_date&#39;, as_index=False).apply(group_func)
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="python-演示分组的具体原理">Python 演示分组的具体原理</h2>
<p>上面的演示中：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">data.groupby(&#34;deal_date&#34;).groups
</span></span></code></pre></td></tr></table>
</div>
</div><p>结果：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">{&#39;2019/1/1&#39;: [0, 1, 2], &#39;2019/1/2&#39;: [3, 4, 5], &#39;2019/1/3&#39;: [6, 7]}
</span></span></code></pre></td></tr></table>
</div>
</div><p>可以看到 Pandas 和 MySQL 分组这步其实都是计算出了每个分组对应的主键 id（索引 id）。但它们具体又是怎么实现的呢？</p>
<p>这时候，我用纯 python 来给大家演示一下。</p>
<p>不管是 MySQL 还是 Pandas，都带有主键索引，只不过 Pandas 的索引不会因为重复而报错，而 MySQL 的索引是肯定唯一的，会覆盖前面索引相同的数据。</p>
<p>虽然 MySQL 将带有索引的数据存储到了磁盘上面，但为了方便，我只在内存上演示索引构建的过程。另外 MySQL 主键索引的数据结构一般是 B+树，这里我用 hash 表（字典）来简单演示。</p>
<p>首先，读取数据并构建索引：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="n">import</span> <span class="n">csv</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">data</span> <span class="o">=</span> <span class="p">{}</span>
</span></span><span class="line"><span class="cl"><span class="n">columns</span> <span class="o">=</span> <span class="n">None</span>
</span></span><span class="line"><span class="cl"><span class="n">with</span> <span class="n">open</span><span class="p">(</span><span class="s2">&#34;data.csv&#34;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s2">&#34;gb18030&#34;</span><span class="p">)</span> <span class="n">as</span> <span class="n">f</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">f_csv</span> <span class="o">=</span> <span class="n">csv</span><span class="o">.</span><span class="n">reader</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">columns</span> <span class="o">=</span> <span class="n">next</span><span class="p">(</span><span class="n">f_csv</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">columns</span> <span class="o">=</span> <span class="n">dict</span><span class="p">(</span><span class="n">zip</span><span class="p">(</span><span class="n">columns</span><span class="p">,</span> <span class="nb">range</span><span class="p">(</span><span class="n">len</span><span class="p">(</span><span class="n">columns</span><span class="p">))))</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">enumerate</span><span class="p">(</span><span class="n">f_csv</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">data</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">row</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">columns</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">display</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>结果：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">{&#39;order_id&#39;: 0, &#39;price&#39;: 1, &#39;deal_date&#39;: 2, &#39;area&#39;: 3}
</span></span><span class="line"><span class="cl">{0: [&#39;S001&#39;, &#39;10&#39;, &#39;2019/1/1&#39;, &#39;A区&#39;],
</span></span><span class="line"><span class="cl"> 1: [&#39;S002&#39;, &#39;20&#39;, &#39;2019/1/1&#39;, &#39;B区&#39;],
</span></span><span class="line"><span class="cl"> 2: [&#39;S003&#39;, &#39;30&#39;, &#39;2019/1/1&#39;, &#39;C区&#39;],
</span></span><span class="line"><span class="cl"> 3: [&#39;S004&#39;, &#39;40&#39;, &#39;2019/1/2&#39;, &#39;A区&#39;],
</span></span><span class="line"><span class="cl"> 4: [&#39;S005&#39;, &#39;10&#39;, &#39;2019/1/2&#39;, &#39;B区&#39;],
</span></span><span class="line"><span class="cl"> 5: [&#39;S006&#39;, &#39;20&#39;, &#39;2019/1/2&#39;, &#39;C区&#39;],
</span></span><span class="line"><span class="cl"> 6: [&#39;S007&#39;, &#39;30&#39;, &#39;2019/1/3&#39;, &#39;A区&#39;],
</span></span><span class="line"><span class="cl"> 7: [&#39;S008&#39;, &#39;40&#39;, &#39;2019/1/3&#39;, &#39;C区&#39;]}
</span></span></code></pre></td></tr></table>
</div>
</div><p>这样我们就读取数据并构建了主键索引，以及表的列名元信息。</p>
<p>下面我们开始实现分组：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># 获取分组数据所在的列
</span></span><span class="line"><span class="cl">group_num = columns[&#39;deal_date&#39;]
</span></span><span class="line"><span class="cl">id_groups = {}
</span></span><span class="line"><span class="cl">for index, row in data.items():
</span></span><span class="line"><span class="cl">    group_key = row[group_num]
</span></span><span class="line"><span class="cl">    ids = id_groups.setdefault(group_key, [])
</span></span><span class="line"><span class="cl">    ids.append(index)
</span></span><span class="line"><span class="cl">id_groups
</span></span></code></pre></td></tr></table>
</div>
</div><p>结果：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">{&#39;2019/1/1&#39;: [0, 1, 2], &#39;2019/1/2&#39;: [3, 4, 5], &#39;2019/1/3&#39;: [6, 7]}
</span></span></code></pre></td></tr></table>
</div>
</div><p>最后完成聚合计算：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">result = {}
</span></span><span class="line"><span class="cl">for deal_date, ids in id_groups.items():
</span></span><span class="line"><span class="cl">    areas = result.setdefault(deal_date, [0, 0, 0])
</span></span><span class="line"><span class="cl">    for index in ids:
</span></span><span class="line"><span class="cl">        area = data[index][columns[&#39;area&#39;]]
</span></span><span class="line"><span class="cl">        if area == &#39;A区&#39;:
</span></span><span class="line"><span class="cl">            areas[0] += 1
</span></span><span class="line"><span class="cl">        elif area == &#39;B区&#39;:
</span></span><span class="line"><span class="cl">            areas[1] += 1
</span></span><span class="line"><span class="cl">        elif area == &#39;C区&#39;:
</span></span><span class="line"><span class="cl">            areas[2] += 1
</span></span><span class="line"><span class="cl">result
</span></span></code></pre></td></tr></table>
</div>
</div><p>结果：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">{&#39;2019/1/1&#39;: [1, 1, 1], &#39;2019/1/2&#39;: [1, 1, 1], &#39;2019/1/3&#39;: [1, 0, 1]}
</span></span></code></pre></td></tr></table>
</div>
</div><p>借助 Pandas 展示一下最终结果：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">pd.DataFrame.from_dict(result, &#39;index&#39;, columns=[&#34;A区&#34;, &#34;B区&#34;, &#34;C区&#34;])
</span></span></code></pre></td></tr></table>
</div>
</div>]]></content:encoded></item><item><title>数据库笔记 04 - Python 操控指南</title><link>https://philohao.com/2020/12/20201202/</link><pubDate>Wed, 02 Dec 2020 15:19:59 +0800</pubDate><dc:creator>Jianfeng.Hao</dc:creator><author>haojianfeng1997@gmail.com (Jianfeng.Hao)</author><guid isPermaLink="true">https://philohao.com/2020/12/20201202/</guid><description>Python 操作数据库学习笔记，概览连接、查询和数据交互的基础方法。</description><content:encoded><![CDATA[<p>这两天待在家里比较闲，利用网络资源学了点儿数据库相关知识，同时对如何用 Python 与数据库进行交互有了进一步的了解。在这里主要是概览性的记录一下学习到的知识点，以备日后温习之用。</p>
<h2 id="key-1-sql-和-nosql">Key 1. SQL 和 NoSQL</h2>
<h3 id="sql">SQL</h3>
<p>SQL 是一种  <strong>结构性查询语言</strong>，用于在关系数据库管理系统（RDBMS）中检索和管理数据。</p>
<p>关系型数据库侧重于以二维表格的形式组织数据。 在实际的关系数据库中的关系也称表，一个关系数据库就是由若干个表组成，每个关系表是一个如下形式的二维数组：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">+----+----------+-----+-----------+----------+
</span></span><span class="line"><span class="cl">| ID | NAME     | AGE | ADDRESS   | SALARY   |
</span></span><span class="line"><span class="cl">+----+----------+-----+-----------+----------+
</span></span><span class="line"><span class="cl">|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
</span></span><span class="line"><span class="cl">|  2 | Khilan   |  25 | Delhi     |  1500.00 |
</span></span><span class="line"><span class="cl">|  3 | kaushik  |  23 | Kota      |  2000.00 |
</span></span><span class="line"><span class="cl">|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
</span></span><span class="line"><span class="cl">|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
</span></span><span class="line"><span class="cl">|  6 | Komal    |  22 | MP        |  4500.00 |
</span></span><span class="line"><span class="cl">|  7 | Muffy    |  24 | Indore    | 10000.00 |
</span></span><span class="line"><span class="cl">+----+----------+-----+-----------+----------+
</span></span></code></pre></td></tr></table>
</div>
</div><p>常见的以 SQL 作为标准数据库语言的关系型数据库有：<a href="https://www.mysql.com/" target="_blank" rel="noopener noreffer">MySQL</a>、<a href="https://www.postgresql.org/" target="_blank" rel="noopener noreffer">PostgreSQL</a>、<a href="https://www-01.ibm.com/software/data/db2/" target="_blank" rel="noopener noreffer">DB2</a>、<a href="https://www.microsoft.com/en-us/sqlserver/default.aspx" target="_blank" rel="noopener noreffer">SQL Server</a> 等。有关 SQL 语句的教程网上有很多，有兴趣的可以看看 <a href="https://www.runoob.com/sql/sql-tutorial.html" target="_blank" rel="noopener noreffer">SQL 教程</a>，比较全面。</p>
<h3 id="nosql">Nosql</h3>
<p>Nosql (Not Only SQL) 指一系列旨在实现数据库模型的方法和项目，与传统的通过 SQL 访问数据的关系型数据库有很大的不同。 使用 NoSQL 的情况下，现实中实体之间的复杂关系可以通过使用不同的数据结构来存储，如：哈希表、数组、树等。</p>
<p>这两天主要学习了 MongoDB 和 Redis 的基本语法及其 Python 实现，有关语法可以参考 <a href="https://www.runoob.com/mongodb/mongodb-tutorial.html" target="_blank" rel="noopener noreffer">MongoDB 教程</a> 和 <a href="https://www.runoob.com/redis/redis-tutorial.html" target="_blank" rel="noopener noreffer">Redis 教程</a>。</p>
<h3 id="总结---中文教程">总结 - 中文教程</h3>
<ul>
<li><a href="https://www.runoob.com/sql/sql-tutorial.html" target="_blank" rel="noopener noreffer">SQL</a></li>
<li><a href="https://www.runoob.com/mongodb/mongodb-tutorial.html" target="_blank" rel="noopener noreffer">MongoDB</a></li>
<li><a href="https://www.runoob.com/redis/redis-tutorial.html" target="_blank" rel="noopener noreffer">Redis</a></li>
</ul>
<h2 id="key-2-python-操作数据库">Key 2. Python 操作数据库</h2>
<p>使用 Python 操作数据库主要有两种方式，以 MySQL 为例：</p>
<ol>
<li>使用原生模块：<code>pymysql</code></li>
<li>ORM 框架：<code>SQLAchemy</code></li>
</ol>
<p>SQLAlchemy 是 python 编程语言下的一款 ORM 框架，面向对象编程把所有实体看成对象（object），关系型数据库则是采用实体之间的关系（relation）连接数据。很早就有人提出，关系也可以用对象表达，这样的话，就能使用面向对象编程，来操作关系型数据库。</p>
<p>简单说，ORM 就是通过实例对象的语法，完成关系型数据库的操作的技术，是&quot;对象-关系映射&quot;（Object/Relational Mapping） 的缩写，ORM 把数据库映射成对象：</p>
<ul>
<li>数据库的表（table） &ndash;&gt; 类（class）</li>
<li>记录（record，行数据）&ndash;&gt; 对象（object）</li>
<li>字段（field）&ndash;&gt; 对象的属性（attribute）</li>
</ul>
]]></content:encoded></item><item><title>数据库笔记 03 - 窗口函数篇</title><link>https://philohao.com/2020/12/20201201/</link><pubDate>Tue, 01 Dec 2020 13:37:44 +0800</pubDate><dc:creator>Jianfeng.Hao</dc:creator><author>haojianfeng1997@gmail.com (Jianfeng.Hao)</author><guid isPermaLink="true">https://philohao.com/2020/12/20201201/</guid><description>SQL 窗口函数学习笔记，整理 OVER、分区、排序和常见分析函数。</description><content:encoded><![CDATA[<h2 id="窗口函数的基本用法">窗口函数的基本用法</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="err">函数名</span><span class="p">()</span><span class="w"> </span><span class="n">OVER</span><span class="p">()</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">xx</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li>
<p>窗口函数就是将表以窗口为单位进行分割，并在其中进行<strong>分组排序</strong>的函数。</p>
</li>
<li>
<p><code>OVER</code> 关键字用来指定函数执行的窗口范围，若后面括号中什么都不写，则意味着窗口包含满足 <code>WHERE</code> 条件的所有行，窗口函数基于所有行进行计算；如果不为空，则支持以下 4 种语法来设置窗口。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="n">mysql</span><span class="o">&gt;</span><span class="w"> </span><span class="k">SELECT</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">RANK</span><span class="p">()</span><span class="w"> </span><span class="n">OVER</span><span class="w"> </span><span class="n">w</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">rk</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">PERCENT_RANK</span><span class="p">()</span><span class="w"> </span><span class="n">OVER</span><span class="w"> </span><span class="n">w</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">prk</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">stu_id</span><span class="p">,</span><span class="w"> </span><span class="n">lesson_id</span><span class="p">,</span><span class="w"> </span><span class="n">score</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">t_score</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="k">WHERE</span><span class="w"> </span><span class="n">stu_id</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">WINDOW</span><span class="w"> </span><span class="n">w</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="p">(</span><span class="n">PARTITION</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">stu_id</span><span class="w"> </span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">score</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="p">;</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li>
<p><code>window_name</code>：给窗口指定一个别名。如果 SQL 中涉及的窗口较多，采用别名可以看起来更清晰易读</p>
</li>
<li>
<p><code>partition by</code> 子句：窗口按照哪些字段进行分组，窗口函数在不同的分组上分别执行</p>
</li>
<li>
<p><code>order by</code> 子句：按照哪些字段进行排序，窗口函数将按照排序后的记录顺序进行编号</p>
</li>
<li>
<p><code>frame</code> 子句：frame 是当前分区的一个子集，子句用来定义子集的规则，通常用来作为滑动窗口使用，这样的统计方法称为<strong>移动平均</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="c1">--指定“最靠近的3行”作为汇总对象
</span></span></span><span class="line"><span class="cl"><span class="c1">--使用 ROWS（行）和 PRECEDING(之前)两个关键字，将框架指定为“截止到之前~行”
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="k">SELECT</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">product_id</span><span class="p">,</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">product_name</span><span class="p">,</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">sale_price</span><span class="p">,</span><span class="w">        
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">AVG</span><span class="p">(</span><span class="n">sale_price</span><span class="p">)</span><span class="w"> </span><span class="n">OVER</span><span class="w"> </span><span class="p">(</span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">product_id</span><span class="w"> </span><span class="k">ROWS</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="n">PRECEDING</span><span class="p">)</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">moving_avg</span><span class="w">   
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">FROM</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">Product</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>使用关键字 FOLLOWING(之后)替换 PRECEDING，就可以指定“截止到之后~行”作为框架。如果希望将当前记录的前后行作为汇总对象，可以同时使用 PRECEDING(之前)和 FOLLOWING（之后）关键字来实现。</p>
</blockquote>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="c1">--将当前记录的前后行作为汇总对象
</span></span></span><span class="line"><span class="cl"><span class="c1">--当前记录的前后行的具体含义就是：之前1行的记录 + 自身（当前记录）+ 之后1行的记录
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">SELECT</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">product_id</span><span class="p">,</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">product_name</span><span class="p">,</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">sale_price</span><span class="p">,</span><span class="w">       
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">AVG</span><span class="p">(</span><span class="n">sale_price</span><span class="p">)</span><span class="w"> </span><span class="n">OVER</span><span class="w"> </span><span class="p">(</span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">product_id</span><span class="w"> </span><span class="k">ROWS</span><span class="w"> </span><span class="k">BETWEEN</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="n">PRECEDING</span><span class="w"> </span><span class="k">AND</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="n">FOLLOWING</span><span class="p">)</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">moving_avg</span><span class="w">   
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">FROM</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">Product</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div></li>
</ul>
</li>
</ul>
<h2 id="窗口函数的执行顺序">窗口函数的执行顺序</h2>
<blockquote>
<p><strong>原理</strong>：窗口函数的执行顺序（逻辑上的）是在 FROM, JOIN, WHERE, GROUP BY, HAVING 之后，在 ORDER BY, LIMIT, SELECT DISTINCT 之前。它执行时 GROUP BY 的聚合过程已经完成了，所以不会再产生数据聚合。</p>
</blockquote>
<p>注：窗口函数是在 where 之后执行的，所以如果 where 子句需要用窗口函数作为条件，需要多一层查询，在子查询外面进行</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">select</span><span class="w"> </span><span class="n">user_id</span><span class="p">,</span><span class="w"> </span><span class="k">avg</span><span class="p">(</span><span class="n">diff</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">from</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="k">select</span><span class="w"> </span><span class="n">user_id</span><span class="p">,</span><span class="w"> </span><span class="n">lead</span><span class="p">(</span><span class="n">log_time</span><span class="p">)</span><span class="w"> </span><span class="n">over</span><span class="p">(</span><span class="n">partition</span><span class="w"> </span><span class="n">user_id</span><span class="w"> </span><span class="k">order</span><span class="w"> </span><span class="k">by</span><span class="w"> </span><span class="n">log_time</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">log_time</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">diff</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="k">from</span><span class="w"> </span><span class="n">user_log</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w"> </span><span class="n">t</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">where</span><span class="w"> </span><span class="n">datediff</span><span class="p">(</span><span class="n">now</span><span class="p">(),</span><span class="w"> </span><span class="n">t</span><span class="p">.</span><span class="n">log_time</span><span class="p">)</span><span class="w"> </span><span class="o">&lt;=</span><span class="w"> </span><span class="mi">30</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">group</span><span class="w"> </span><span class="k">by</span><span class="w"> </span><span class="n">user_id</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><h2 id="窗口函数和普通聚合函数的区别">窗口函数和普通聚合函数的区别</h2>
<ol>
<li>
<p>聚合函数是将多条记录聚合为一条；窗口函数是每条记录都会执行，有几条记录执行完还是几条</p>
</li>
<li>
<p>所有的聚合函数都能用作窗口函数，起到类似<strong>累加/累乘</strong>的效果</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="c1">--将SUM函数作为窗口函数使用
</span></span></span><span class="line"><span class="cl"><span class="c1">--使用聚合函数作为窗口函数时，需要在其括号内指定相应的列
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="k">SELECT</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">product_id</span><span class="p">,</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">product_name</span><span class="p">,</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">sale_price</span><span class="p">,</span><span class="w">        
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">SUM</span><span class="p">(</span><span class="n">sale_price</span><span class="p">)</span><span class="w"> </span><span class="n">OVER</span><span class="w"> </span><span class="p">(</span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">product_id</span><span class="p">)</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">current_sum</span><span class="w">   
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">FROM</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">Product</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p>目前为止我们学过的函数大多数都没有使用位置的限制，最多也就是<u>在 WHERE 子句不能使用聚合函数</u>。但是，使用窗口函数的位置却有很大的限制，确切的说，<u>窗口函数只能在 SELECT 子句中使用</u>。</p>
</li>
</ol>
<h2 id="常用窗口函数">常用窗口函数</h2>
<h3 id="序号函数">序号函数</h3>
<blockquote>
<p>row_number(), rank(), dense_rank()</p>
<p>应用场景：【排名问题】 - 如，各科的第一名分别是谁？</p>
</blockquote>
<ul>
<li>
<p><code>ROW_NUMBER()</code>：顺序排序——1、2、3</p>
</li>
<li>
<p><code>RANK()</code>：并列排序，跳过重复序号——1、1、3</p>
</li>
<li>
<p><code>DENSE_RANK()</code>：并列排序，不跳过重复序号——1、1、2</p>
</li>
</ul>
<h3 id="分布函数">分布函数</h3>
<blockquote>
<p>percent_rank(), cume_dist()</p>
<p>应用场景：【比例问题】 - 如，小于等于当前成绩的比例？</p>
</blockquote>
<ul>
<li>
<p>percent_rank()：每行按照公式<code>(rank-1) / (rows-1)</code>进行计算。其中，<code>rank</code>为<code>RANK()函数</code>产生的序号，<code>rows</code>为当前窗口的记录总行数</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="c1">--给窗口指定别名：WINDOW w AS (PARTITION BY stu_id ORDER BY score)
</span></span></span><span class="line"><span class="cl"><span class="c1">--此例中 rows = 7
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">mysql</span><span class="o">&gt;</span><span class="w"> </span><span class="k">SELECT</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">RANK</span><span class="p">()</span><span class="w"> </span><span class="n">OVER</span><span class="w"> </span><span class="n">w</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">rk</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">PERCENT_RANK</span><span class="p">()</span><span class="w"> </span><span class="n">OVER</span><span class="w"> </span><span class="n">w</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">prk</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">stu_id</span><span class="p">,</span><span class="w"> </span><span class="n">lesson_id</span><span class="p">,</span><span class="w"> </span><span class="n">score</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">t_score</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="k">WHERE</span><span class="w"> </span><span class="n">stu_id</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">WINDOW</span><span class="w"> </span><span class="n">w</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="p">(</span><span class="n">PARTITION</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">stu_id</span><span class="w"> </span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">score</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">+</span><span class="c1">----+------+--------+-----------+-------+
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="o">|</span><span class="w"> </span><span class="n">rk</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">prk</span><span class="w">  </span><span class="o">|</span><span class="w"> </span><span class="n">stu_id</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">lesson_id</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">score</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">+</span><span class="c1">----+------+--------+-----------+-------+
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="o">|</span><span class="w">  </span><span class="mi">1</span><span class="w"> </span><span class="o">|</span><span class="w">    </span><span class="mi">0</span><span class="w"> </span><span class="o">|</span><span class="w">      </span><span class="mi">1</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L003</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">79</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">|</span><span class="w">  </span><span class="mi">2</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">0</span><span class="p">.</span><span class="mi">25</span><span class="w"> </span><span class="o">|</span><span class="w">      </span><span class="mi">1</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L002</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">86</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">|</span><span class="w">  </span><span class="mi">3</span><span class="w"> </span><span class="o">|</span><span class="w">  </span><span class="mi">0</span><span class="p">.</span><span class="mi">5</span><span class="w"> </span><span class="o">|</span><span class="w">      </span><span class="mi">1</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L004</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">88</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">|</span><span class="w">  </span><span class="mi">4</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">0</span><span class="p">.</span><span class="mi">75</span><span class="w"> </span><span class="o">|</span><span class="w">      </span><span class="mi">1</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L005</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">98</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">|</span><span class="w">  </span><span class="mi">4</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">0</span><span class="p">.</span><span class="mi">75</span><span class="w"> </span><span class="o">|</span><span class="w">      </span><span class="mi">1</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L001</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">98</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">|</span><span class="w">  </span><span class="mi">1</span><span class="w"> </span><span class="o">|</span><span class="w">    </span><span class="mi">0</span><span class="w"> </span><span class="o">|</span><span class="w">      </span><span class="mi">2</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L006</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">82</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">|</span><span class="w">  </span><span class="mi">2</span><span class="w"> </span><span class="o">|</span><span class="w">    </span><span class="mi">1</span><span class="w"> </span><span class="o">|</span><span class="w">      </span><span class="mi">2</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L007</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">99</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">+</span><span class="c1">----+------+--------+-----------+-------+
</span></span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p>cume_dist()：分组内小于、等于当前 rank 值的行数 / 分组内总行数 eg:查询小于等于当前成绩（score）的比例</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="c1">--cd1：没有分区，则所有数据均为一组，总行数为 8
</span></span></span><span class="line"><span class="cl"><span class="c1">--cd2：按照 lesson_id 分成了两组，行数各为 4
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">mysql</span><span class="o">&gt;</span><span class="w"> </span><span class="k">SELECT</span><span class="w"> </span><span class="n">stu_id</span><span class="p">,</span><span class="w"> </span><span class="n">lesson_id</span><span class="p">,</span><span class="w"> </span><span class="n">score</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">CUME_DIST</span><span class="p">()</span><span class="w"> </span><span class="n">OVER</span><span class="w"> </span><span class="p">(</span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">score</span><span class="p">)</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">cd1</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">CUME_DIST</span><span class="p">()</span><span class="w"> </span><span class="n">OVER</span><span class="w"> </span><span class="p">(</span><span class="n">PARTITION</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">lesson_id</span><span class="w"> </span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">score</span><span class="p">)</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">cd2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">t_score</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="k">WHERE</span><span class="w"> </span><span class="n">lesson_id</span><span class="w"> </span><span class="k">IN</span><span class="w"> </span><span class="p">(</span><span class="s1">&#39;L001&#39;</span><span class="p">,</span><span class="s1">&#39;L002&#39;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">+</span><span class="c1">--------+-----------+-------+-------+------+
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="o">|</span><span class="w"> </span><span class="n">stu_id</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">lesson_id</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">score</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">cd1</span><span class="w">   </span><span class="o">|</span><span class="w"> </span><span class="n">cd2</span><span class="w">  </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">+</span><span class="c1">--------+-----------+-------+-------+------+
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="o">|</span><span class="w">      </span><span class="mi">2</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L001</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">84</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">0</span><span class="p">.</span><span class="mi">125</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">0</span><span class="p">.</span><span class="mi">25</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">|</span><span class="w">      </span><span class="mi">1</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L001</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">98</span><span class="w"> </span><span class="o">|</span><span class="w">  </span><span class="mi">0</span><span class="p">.</span><span class="mi">75</span><span class="w"> </span><span class="o">|</span><span class="w">  </span><span class="mi">0</span><span class="p">.</span><span class="mi">5</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">|</span><span class="w">      </span><span class="mi">4</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L001</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">99</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">0</span><span class="p">.</span><span class="mi">875</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">0</span><span class="p">.</span><span class="mi">75</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">|</span><span class="w">      </span><span class="mi">3</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L001</span><span class="w">      </span><span class="o">|</span><span class="w">   </span><span class="mi">100</span><span class="w"> </span><span class="o">|</span><span class="w">     </span><span class="mi">1</span><span class="w"> </span><span class="o">|</span><span class="w">    </span><span class="mi">1</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">|</span><span class="w">      </span><span class="mi">1</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L002</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">86</span><span class="w"> </span><span class="o">|</span><span class="w">  </span><span class="mi">0</span><span class="p">.</span><span class="mi">25</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">0</span><span class="p">.</span><span class="mi">25</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">|</span><span class="w">      </span><span class="mi">4</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L002</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">88</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">0</span><span class="p">.</span><span class="mi">375</span><span class="w"> </span><span class="o">|</span><span class="w">  </span><span class="mi">0</span><span class="p">.</span><span class="mi">5</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">|</span><span class="w">      </span><span class="mi">2</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L002</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">90</span><span class="w"> </span><span class="o">|</span><span class="w">   </span><span class="mi">0</span><span class="p">.</span><span class="mi">5</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">0</span><span class="p">.</span><span class="mi">75</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">|</span><span class="w">      </span><span class="mi">3</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L002</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">91</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">0</span><span class="p">.</span><span class="mi">625</span><span class="w"> </span><span class="o">|</span><span class="w">    </span><span class="mi">1</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">+</span><span class="c1">--------+-----------+-------+-------+------+
</span></span></span></code></pre></td></tr></table>
</div>
</div></li>
</ul>
<h3 id="前后函数">前后函数</h3>
<blockquote>
<p>lag(expr, n), lead(expr, n)</p>
<p>作用：返回位于当前行的前 n 行（<code>LAG(expr,n)</code>）或后 n 行（<code>LEAD(expr,n)</code>）的 expr 的值</p>
<p>应用场景：查询前 1 名同学的成绩和当前同学成绩的差值</p>
</blockquote>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="n">mysql</span><span class="o">&gt;</span><span class="w"> </span><span class="k">SELECT</span><span class="w"> </span><span class="n">stu_id</span><span class="p">,</span><span class="w"> </span><span class="n">lesson_id</span><span class="p">,</span><span class="w"> </span><span class="n">score</span><span class="p">,</span><span class="w"> </span><span class="n">pre_score</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">score</span><span class="o">-</span><span class="n">pre_score</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">diff</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="k">FROM</span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w">     </span><span class="k">SELECT</span><span class="w"> </span><span class="n">stu_id</span><span class="p">,</span><span class="w"> </span><span class="n">lesson_id</span><span class="p">,</span><span class="w"> </span><span class="n">score</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w">     </span><span class="n">LAG</span><span class="p">(</span><span class="n">score</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="n">OVER</span><span class="w"> </span><span class="n">w</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">pre_score</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w">     </span><span class="k">FROM</span><span class="w"> </span><span class="n">t_score</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w">     </span><span class="k">WHERE</span><span class="w"> </span><span class="n">lesson_id</span><span class="w"> </span><span class="k">IN</span><span class="w"> </span><span class="p">(</span><span class="s1">&#39;L001&#39;</span><span class="p">,</span><span class="s1">&#39;L002&#39;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w">     </span><span class="n">WINDOW</span><span class="w"> </span><span class="n">w</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="p">(</span><span class="n">PARTITION</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">lesson_id</span><span class="w"> </span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">score</span><span class="p">))</span><span class="w"> </span><span class="n">t</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">+</span><span class="c1">--------+-----------+-------+-----------+------+
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="o">|</span><span class="w"> </span><span class="n">stu_id</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">lesson_id</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">score</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">pre_score</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">diff</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">+</span><span class="c1">--------+-----------+-------+-----------+------+
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="o">|</span><span class="w">      </span><span class="mi">2</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L001</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">84</span><span class="w"> </span><span class="o">|</span><span class="w">      </span><span class="k">NULL</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">NULL</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">|</span><span class="w">      </span><span class="mi">1</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L001</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">98</span><span class="w"> </span><span class="o">|</span><span class="w">        </span><span class="mi">84</span><span class="w"> </span><span class="o">|</span><span class="w">   </span><span class="mi">14</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">|</span><span class="w">      </span><span class="mi">4</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L001</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">99</span><span class="w"> </span><span class="o">|</span><span class="w">        </span><span class="mi">98</span><span class="w"> </span><span class="o">|</span><span class="w">    </span><span class="mi">1</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">|</span><span class="w">      </span><span class="mi">3</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L001</span><span class="w">      </span><span class="o">|</span><span class="w">   </span><span class="mi">100</span><span class="w"> </span><span class="o">|</span><span class="w">        </span><span class="mi">99</span><span class="w"> </span><span class="o">|</span><span class="w">    </span><span class="mi">1</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">|</span><span class="w">      </span><span class="mi">1</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L002</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">86</span><span class="w"> </span><span class="o">|</span><span class="w">      </span><span class="k">NULL</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">NULL</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">|</span><span class="w">      </span><span class="mi">4</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L002</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">88</span><span class="w"> </span><span class="o">|</span><span class="w">        </span><span class="mi">86</span><span class="w"> </span><span class="o">|</span><span class="w">    </span><span class="mi">2</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">|</span><span class="w">      </span><span class="mi">2</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L002</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">90</span><span class="w"> </span><span class="o">|</span><span class="w">        </span><span class="mi">88</span><span class="w"> </span><span class="o">|</span><span class="w">    </span><span class="mi">2</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">|</span><span class="w">      </span><span class="mi">3</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L002</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">91</span><span class="w"> </span><span class="o">|</span><span class="w">        </span><span class="mi">90</span><span class="w"> </span><span class="o">|</span><span class="w">    </span><span class="mi">1</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">+</span><span class="c1">--------+-----------+-------+-----------+------+
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="头尾函数">头尾函数</h3>
<blockquote>
<p>FIRST_VALUE(expr), LAST_VALUE(expr)</p>
<p>作用：返回第一个（<code>FIRST_VALUE(expr)</code>）或最后一个（<code>LAST_VALUE(expr)</code>）expr 的值</p>
<p>应用场景：截止到当前成绩，按照日期排序查询第 1 个和最后 1 个同学的分数</p>
</blockquote>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="n">mysql</span><span class="o">&gt;</span><span class="w"> </span><span class="k">SELECT</span><span class="w"> </span><span class="n">stu_id</span><span class="p">,</span><span class="w"> </span><span class="n">lesson_id</span><span class="p">,</span><span class="w"> </span><span class="n">score</span><span class="p">,</span><span class="w"> </span><span class="n">create_time</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">FIRST_VALUE</span><span class="p">(</span><span class="n">score</span><span class="p">)</span><span class="w"> </span><span class="n">OVER</span><span class="w"> </span><span class="n">w</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">first_score</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">LAST_VALUE</span><span class="p">(</span><span class="n">score</span><span class="p">)</span><span class="w"> </span><span class="n">OVER</span><span class="w"> </span><span class="n">w</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">last_score</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">t_score</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="k">WHERE</span><span class="w"> </span><span class="n">lesson_id</span><span class="w"> </span><span class="k">IN</span><span class="w"> </span><span class="p">(</span><span class="s1">&#39;L001&#39;</span><span class="p">,</span><span class="s1">&#39;L002&#39;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">WINDOW</span><span class="w"> </span><span class="n">w</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="p">(</span><span class="n">PARTITION</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">lesson_id</span><span class="w"> </span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">create_time</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">-&gt;</span><span class="w"> </span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">+</span><span class="c1">--------+-----------+-------+-------------+-------------+------------+
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="o">|</span><span class="w"> </span><span class="n">stu_id</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">lesson_id</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">score</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">create_time</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">first_score</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">last_score</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">+</span><span class="c1">--------+-----------+-------+-------------+-------------+------------+
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="o">|</span><span class="w">      </span><span class="mi">3</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L001</span><span class="w">      </span><span class="o">|</span><span class="w">   </span><span class="mi">100</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">2018</span><span class="o">-</span><span class="mi">08</span><span class="o">-</span><span class="mi">07</span><span class="w">  </span><span class="o">|</span><span class="w">         </span><span class="mi">100</span><span class="w"> </span><span class="o">|</span><span class="w">        </span><span class="mi">100</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">|</span><span class="w">      </span><span class="mi">1</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L001</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">98</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">2018</span><span class="o">-</span><span class="mi">08</span><span class="o">-</span><span class="mi">08</span><span class="w">  </span><span class="o">|</span><span class="w">         </span><span class="mi">100</span><span class="w"> </span><span class="o">|</span><span class="w">         </span><span class="mi">98</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">|</span><span class="w">      </span><span class="mi">2</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L001</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">84</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">2018</span><span class="o">-</span><span class="mi">08</span><span class="o">-</span><span class="mi">09</span><span class="w">  </span><span class="o">|</span><span class="w">         </span><span class="mi">100</span><span class="w"> </span><span class="o">|</span><span class="w">         </span><span class="mi">99</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">|</span><span class="w">      </span><span class="mi">4</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L001</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">99</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">2018</span><span class="o">-</span><span class="mi">08</span><span class="o">-</span><span class="mi">09</span><span class="w">  </span><span class="o">|</span><span class="w">         </span><span class="mi">100</span><span class="w"> </span><span class="o">|</span><span class="w">         </span><span class="mi">99</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">|</span><span class="w">      </span><span class="mi">3</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L002</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">91</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">2018</span><span class="o">-</span><span class="mi">08</span><span class="o">-</span><span class="mi">07</span><span class="w">  </span><span class="o">|</span><span class="w">          </span><span class="mi">91</span><span class="w"> </span><span class="o">|</span><span class="w">         </span><span class="mi">91</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">|</span><span class="w">      </span><span class="mi">1</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L002</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">86</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">2018</span><span class="o">-</span><span class="mi">08</span><span class="o">-</span><span class="mi">08</span><span class="w">  </span><span class="o">|</span><span class="w">          </span><span class="mi">91</span><span class="w"> </span><span class="o">|</span><span class="w">         </span><span class="mi">86</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">|</span><span class="w">      </span><span class="mi">2</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L002</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">90</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">2018</span><span class="o">-</span><span class="mi">08</span><span class="o">-</span><span class="mi">09</span><span class="w">  </span><span class="o">|</span><span class="w">          </span><span class="mi">91</span><span class="w"> </span><span class="o">|</span><span class="w">         </span><span class="mi">90</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">|</span><span class="w">      </span><span class="mi">4</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">L002</span><span class="w">      </span><span class="o">|</span><span class="w">    </span><span class="mi">88</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">2018</span><span class="o">-</span><span class="mi">08</span><span class="o">-</span><span class="mi">10</span><span class="w">  </span><span class="o">|</span><span class="w">          </span><span class="mi">91</span><span class="w"> </span><span class="o">|</span><span class="w">         </span><span class="mi">88</span><span class="w"> </span><span class="o">|</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">+</span><span class="c1">--------+-----------+-------+-------------+-------------+------------+
</span></span></span></code></pre></td></tr></table>
</div>
</div>]]></content:encoded></item><item><title>Linux 探索 01 - Bash Script</title><link>https://philohao.com/2020/03/20200306/</link><pubDate>Sat, 07 Mar 2020 18:22:24 +0800</pubDate><dc:creator>Jianfeng.Hao</dc:creator><author>haojianfeng1997@gmail.com (Jianfeng.Hao)</author><guid isPermaLink="true">https://philohao.com/2020/03/20200306/</guid><description>Bash Script 学习笔记，记录 Shell 脚本基础语法、变量和流程控制。</description><content:encoded><![CDATA[<h2 id="shell-脚本">Shell 脚本</h2>
<p>Shell 编程跟 JavaScript、php 编程一样，只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。</p>
<p>Linux 的 Shell 种类众多，本教程关注的是 Bash，也就是 Bourne Again Shell，由于易用和免费，Bash 在日常工作中被广泛使用。同时，Bash 也是大多数Linux 系统默认的 Shell。</p>
<p>在一般情况下，人们并不区分 Bourne Shell 和 Bourne Again Shell，所以，像 <strong>#!/bin/sh</strong>，它同样也可以改为 <strong>#!/bin/bash</strong>。</p>
<blockquote>
<p><strong>#!</strong> 是一个约定的标记，它告诉系统这个脚本需要什么解释器来执行，即使用哪一种 Shell。</p>
</blockquote>
<p>Shell 脚本（shell script），是一种为 shell 编写的脚本程序。业界所说的 shell 通常都是指 shell 脚本，但读者朋友要知道，shell 和 shell script 是两个不同的概念。由于习惯的原因，简洁起见，本文出现的 &ldquo;shell编程&rdquo; 都是指 shell 脚本编程，不是指开发 shell 自身。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="nb">echo</span> <span class="s2">&#34;Hello World !&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>echo 命令用于向窗口输出文本。</p>
</blockquote>
<hr>
<h2 id="变量与数据">变量与数据</h2>
<h3 id="shell-变量">Shell 变量</h3>
<h4 id="定义变量">定义变量</h4>
<p>定义变量时，变量名不加美元符号$，且变量名和等号之间<code>不能</code>有空格：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">your_name</span><span class="o">=</span><span class="s2">&#34;runoob.com&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>除了显式地直接赋值，还可以用语句给变量赋值，如：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="k">for</span> file in <span class="sb">`</span>ls /etc<span class="sb">`</span>
</span></span><span class="line"><span class="cl">或
</span></span><span class="line"><span class="cl"><span class="k">for</span> file in <span class="k">$(</span>ls /etc<span class="k">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>以上语句将 /etc 下目录的文件名循环出来。</p>
<h5 id="变量命名">变量命名</h5>
<p>同时，变量名的命名须遵循如下规则：</p>
<ul>
<li>命名只能使用英文字母，数字和下划线，首个字符不能以数字开头</li>
<li>中间不能有空格，可以使用下划线（_）</li>
<li>不能使用标点符号</li>
<li>不能使用 bash 里的关键字（可用 help 命令查看保留关键字）</li>
</ul>
<h5 id="变量类型">变量类型</h5>
<p>运行shell时，会同时存在三种变量：</p>
<ul>
<li>
<p>局部变量</p>
<p>在脚本或命令中定义，仅在当前 shell 实例中有效，其他 shell 启动的程序不能访问局部变量。</p>
</li>
<li>
<p>环境变量</p>
<p>所有的程序，包括 shell 启动的程序，都能访问环境变量，有些程序需要环境变量来保证其正常运行。必要的时候 shell 脚本也可以定义环境变量。</p>
</li>
<li>
<p>shell 变量</p>
<p>shell 变量是由 shell 程序设置的特殊变量。shell 变量中有一部分是环境变量，有一部分是局部变量，这些变量保证了 shell 的正常运行。</p>
</li>
</ul>
<h4 id="使用变量">使用变量</h4>
<p>使用一个定义过的变量，只要在变量名前面加<code>美元符号</code>即可，如：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">your_name</span><span class="o">=</span><span class="s2">&#34;qinjx&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="nv">$your_name</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="si">${</span><span class="nv">your_name</span><span class="si">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>变量名外面的花括号是可选的，加不加都行，加花括号是为了帮助解释器识别变量的边界，推荐给所有变量加上花括号，这是个好的编程习惯。</p>
<h4 id="只读变量">只读变量</h4>
<p>使用 <code>readonly 命令</code>可以将变量定义为只读变量，只读变量的值不能被改变。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="nv">myUrl</span><span class="o">=</span><span class="s2">&#34;https://www.google.com&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">readonly</span> myUrl
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="删除变量">删除变量</h4>
<p>使用 <code>unset 命令</code>可以删除变量。语法：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">unset</span> variable_name
</span></span></code></pre></td></tr></table>
</div>
</div><p>变量被删除后不能再次使用，unset 命令不能删除只读变量。</p>
<hr>
<h3 id="数据类型">数据类型</h3>
<h4 id="注释">注释</h4>
<p>以 <code>#</code>开头的行就是注释，会被解释器忽略。多行注释还可以使用以下格式：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">:<span class="s">&lt;&lt;EOF
</span></span></span><span class="line"><span class="cl"><span class="s">注释内容...
</span></span></span><span class="line"><span class="cl"><span class="s">注释内容...
</span></span></span><span class="line"><span class="cl"><span class="s">注释内容...
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>EOF 也可以使用其他符号：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">:&lt;&lt;<span class="s1">&#39;
</span></span></span><span class="line"><span class="cl"><span class="s1">注释内容...
</span></span></span><span class="line"><span class="cl"><span class="s1">注释内容...
</span></span></span><span class="line"><span class="cl"><span class="s1">注释内容...
</span></span></span><span class="line"><span class="cl"><span class="s1">&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">:&lt;&lt;!
</span></span><span class="line"><span class="cl">注释内容...
</span></span><span class="line"><span class="cl">注释内容...
</span></span><span class="line"><span class="cl">注释内容...
</span></span><span class="line"><span class="cl">!
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="字符串">字符串</h4>
<p>字符串可以用单引号，也可以用双引号，也可以不用引号。</p>
<ul>
<li>
<p>单引号</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">str</span><span class="o">=</span><span class="s1">&#39;this is a string&#39;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li>单引号里的任何字符都会原样输出，单引号字符串中的变量是无效的；</li>
<li>单引号字串中不能出现单独一个的单引号（对单引号使用转义符后也不行），但可成对出现，作为字符串拼接使用。</li>
</ul>
</li>
<li>
<p>双引号</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">your_name</span><span class="o">=</span><span class="s1">&#39;runoob&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nv">str</span><span class="o">=</span><span class="s2">&#34;Hello, I know you are \&#34;</span><span class="nv">$your_name</span><span class="s2">\&#34;! \n&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -e <span class="nv">$str</span>
</span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li>双引号里可以有变量；</li>
<li>双引号里可以出现转义字符。</li>
</ul>
</li>
</ul>
<h5 id="拼接字符串">拼接字符串</h5>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">your_name</span><span class="o">=</span><span class="s2">&#34;runoob&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1">## 使用双引号拼接</span>
</span></span><span class="line"><span class="cl"><span class="nv">greeting</span><span class="o">=</span><span class="s2">&#34;hello, &#34;</span><span class="nv">$your_name</span><span class="s2">&#34; !&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">greeting_1</span><span class="o">=</span><span class="s2">&#34;hello, </span><span class="si">${</span><span class="nv">your_name</span><span class="si">}</span><span class="s2"> !&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="nv">$greeting</span>  <span class="nv">$greeting_1</span>
</span></span><span class="line"><span class="cl"><span class="c1">## 使用单引号拼接</span>
</span></span><span class="line"><span class="cl"><span class="nv">greeting_2</span><span class="o">=</span><span class="s1">&#39;hello, &#39;</span><span class="nv">$your_name</span><span class="s1">&#39; !&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nv">greeting_3</span><span class="o">=</span><span class="s1">&#39;hello, ${your_name} !&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="nv">$greeting_2</span>  <span class="nv">$greeting_3</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>输出结果为：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">hello, runoob ! hello, runoob !
</span></span><span class="line"><span class="cl">hello, runoob ! hello, <span class="si">${</span><span class="nv">your_name</span><span class="si">}</span> !
</span></span></code></pre></td></tr></table>
</div>
</div><h5 id="获取字符串长度">获取字符串长度</h5>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">string</span><span class="o">=</span><span class="s2">&#34;abcd&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="si">${#</span><span class="nv">string</span><span class="si">}</span> <span class="c1">#输出 4</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h5 id="提取子字符串">提取子字符串</h5>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">string</span><span class="o">=</span><span class="s2">&#34;runoob is a great site&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="si">${</span><span class="nv">string</span><span class="p">:</span><span class="nv">1</span><span class="p">:</span><span class="nv">4</span><span class="si">}</span> <span class="c1">## 输出 unoo</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p><strong>注意</strong>：第一个字符的索引值为 <strong>0</strong>。</p>
</blockquote>
<h5 id="查找子字符串">查找子字符串</h5>
<p>查找字符 <strong>i</strong> 或 <strong>o</strong> 的位置(哪个字母先出现就计算哪个)：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">string</span><span class="o">=</span><span class="s2">&#34;runoob is a great site&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="sb">`</span>expr index <span class="s2">&#34;</span><span class="nv">$string</span><span class="s2">&#34;</span> io<span class="sb">`</span>  <span class="c1">## 输出 4</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p><strong>注意：</strong> 以上脚本中 <strong>`</strong> 是反引号，而不是单引号 <strong>&rsquo;</strong></p>
</blockquote>
<h4 id="数组">数组</h4>
<ul>
<li>bash支持一维数组（不支持多维数组），并且没有限定数组的大小；</li>
<li>类似于 C 语言，数组元素的下标由 0 开始编号；</li>
<li>获取数组中的元素要利用下标，下标可以是整数或算术表达式，其值应大于或等于 0。</li>
</ul>
<h5 id="定义数组">定义数组</h5>
<p>在 Shell 中，用括号来表示数组，数组元素用&quot;空格&quot;符号分割开。定义数组的一般形式为：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">array_name</span><span class="o">=(</span>value0 value1 value2 value3<span class="o">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>还可以单独定义数组的各个分量：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">array_name<span class="o">[</span>0<span class="o">]=</span>value0
</span></span><span class="line"><span class="cl">array_name<span class="o">[</span>1<span class="o">]=</span>value1
</span></span><span class="line"><span class="cl">array_name<span class="o">[</span>n<span class="o">]=</span>valuen
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>可以不使用连续的下标，而且下标的范围没有限制。</p>
</blockquote>
<h5 id="读取数组">读取数组</h5>
<p>读取数组元素值的一般格式是：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">valuen</span><span class="o">=</span><span class="si">${</span><span class="nv">array_name</span><span class="p">[n]</span><span class="si">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>使用 <strong>@</strong> 符号可以获取数组中的所有元素，例如：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">echo</span> <span class="si">${</span><span class="nv">array_name</span><span class="p">[@]</span><span class="si">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h5 id="获取数组的长度">获取数组的长度</h5>
<p>获取数组长度的方法与获取字符串长度的方法相同：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1">## 取得数组元素的个数</span>
</span></span><span class="line"><span class="cl"><span class="nv">length</span><span class="o">=</span><span class="si">${#</span><span class="nv">array_name</span><span class="p">[@]</span><span class="si">}</span>
</span></span><span class="line"><span class="cl"><span class="c1">## 或者</span>
</span></span><span class="line"><span class="cl"><span class="nv">length</span><span class="o">=</span><span class="si">${#</span><span class="nv">array_name</span><span class="p">[*]</span><span class="si">}</span>
</span></span><span class="line"><span class="cl"><span class="c1">## 取得数组单个元素的长度</span>
</span></span><span class="line"><span class="cl"><span class="nv">lengthn</span><span class="o">=</span><span class="si">${#</span><span class="nv">array_name</span><span class="p">[n]</span><span class="si">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="命令与函数">命令与函数</h2>
<h3 id="运算符">运算符</h3>
<hr>
<h3 id="基本命令">基本命令</h3>
<hr>
<h3 id="自定义函数">自定义函数</h3>
<hr>
<h2 id="流程与文件">流程与文件</h2>
<h3 id="流程控制">流程控制</h3>
<hr>
<h3 id="脚本执行">脚本执行</h3>
<ol>
<li>
<p><strong>作为可执行程序</strong></p>
<p>将上面的代码保存为 test.sh，并 cd 到相应目录：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">chmod +x ./test.sh  <span class="c1">#使脚本具有执行权限</span>
</span></span><span class="line"><span class="cl">./test.sh  <span class="c1">#执行脚本</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>注意，一定要写成 <strong>./test.sh</strong>，而不是 <strong>test.sh</strong>，运行其它二进制的程序也一样，直接写 test.sh，linux 系统会去 PATH 里寻找有没有叫 test.sh 的，而只有 /bin, /sbin, /usr/bin，/usr/sbin 等在 PATH 里，你的当前目录通常不在 PATH 里，所以写成 test.sh 是会找不到命令的，要用 ./test.sh 告诉系统说，就在当前目录找。</p>
</li>
<li>
<p><strong>作为解释器参数</strong></p>
<p>这种运行方式是，直接运行解释器，其参数就是 shell 脚本的文件名，如：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">/bin/sh test.sh
</span></span><span class="line"><span class="cl">/bin/php test.php
</span></span></code></pre></td></tr></table>
</div>
</div><p>这种方式运行的脚本，不需要在第一行指定解释器信息，写了也没用。</p>
</li>
</ol>
<hr>
<h3 id="文件包含">文件包含</h3>
<p>和其他语言一样，Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。</p>
<p>Shell 文件包含的语法格式如下：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">. filename   <span class="c1">## 注意点号(.)和文件名中间有一空格</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">或
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">source</span> filename
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="实例">实例</h4>
<p>创建两个 shell 脚本文件。</p>
<p>test1.sh 代码如下：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="c1">## author:菜鸟教程</span>
</span></span><span class="line"><span class="cl"><span class="c1">## url:www.runoob.com</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">url</span><span class="o">=</span><span class="s2">&#34;https://www.runoob.com&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>test2.sh 代码如下：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="c1">## author:菜鸟教程</span>
</span></span><span class="line"><span class="cl"><span class="c1">## url:www.runoob.com</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#使用 . 号来引用test1.sh 文件</span>
</span></span><span class="line"><span class="cl">. ./test1.sh
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## 或者使用以下包含文件代码</span>
</span></span><span class="line"><span class="cl"><span class="c1">## source ./test1.sh</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;菜鸟教程官网地址：</span><span class="nv">$url</span><span class="s2">&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>接下来，我们为 test2.sh 添加可执行权限并执行：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ chmod +x test2.sh
</span></span><span class="line"><span class="cl">$ ./test2.sh
</span></span><span class="line"><span class="cl">菜鸟教程官网地址：https://www.runoob.com
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>**注：**被包含的文件 test1.sh 不需要可执行权限。</p>
</blockquote>
<hr>
<h3 id="输入输出重定向">输入/输出重定向</h3>
<h4 id="基本命令-1">基本命令</h4>
<table>
<thead>
<tr>
<th style="text-align:left">命令</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">command &gt; file</td>
<td style="text-align:left">将输出重定向到 file。</td>
</tr>
<tr>
<td style="text-align:left">command &lt; file</td>
<td style="text-align:left">将输入重定向到 file。</td>
</tr>
<tr>
<td style="text-align:left">command &raquo; file</td>
<td style="text-align:left">将输出以追加的方式重定向到 file。</td>
</tr>
<tr>
<td style="text-align:left">n &gt; file</td>
<td style="text-align:left">将文件描述符为 n 的文件重定向到 file。</td>
</tr>
<tr>
<td style="text-align:left">n &raquo; file</td>
<td style="text-align:left">将文件描述符为 n 的文件以追加的方式重定向到 file。</td>
</tr>
<tr>
<td style="text-align:left">n &gt;&amp; m</td>
<td style="text-align:left">将输出文件 m 和 n 合并。</td>
</tr>
<tr>
<td style="text-align:left">n &lt;&amp; m</td>
<td style="text-align:left">将输入文件 m 和 n 合并。</td>
</tr>
<tr>
<td style="text-align:left">&laquo; tag</td>
<td style="text-align:left">将开始标记 tag 和结束标记 tag 之间的内容作为输入。</td>
</tr>
</tbody>
</table>
<blockquote>
<p>文件描述符 0 通常是标准输入（STDIN），1 是标准输出（STDOUT），2 是标准错误输出（STDERR）</p>
</blockquote>
<h4 id="深入讲解">深入讲解</h4>
<p>一般情况下，每个 Unix/Linux 命令运行时都会打开三个文件：</p>
<ul>
<li>标准输入文件(stdin)：stdin的文件描述符为0，Unix程序默认从stdin读取数据；</li>
<li>标准输出文件(stdout)：stdout 的文件描述符为1，Unix程序默认向stdout输出数据；</li>
<li>标准错误文件(stderr)：stderr的文件描述符为2，Unix程序会向stderr流中写入错误信息。</li>
</ul>
<p>默认情况下，command &gt; file 将 stdout 重定向到 file，command &lt; file 将stdin 重定向到 file。</p>
<p>如果希望 stderr 重定向到 file，可以这样写：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ <span class="nb">command</span> <span class="m">2</span> &gt; file
</span></span></code></pre></td></tr></table>
</div>
</div><p>如果希望将 stdout 和 stderr 合并后重定向到 file，可以这样写：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ <span class="nb">command</span> &gt; file 2&gt;<span class="p">&amp;</span><span class="m">1</span>
</span></span><span class="line"><span class="cl"><span class="c1">## 或者</span>
</span></span><span class="line"><span class="cl">$ <span class="nb">command</span> &gt;&gt; file 2&gt;<span class="p">&amp;</span><span class="m">1</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>如果希望对 stdin 和 stdout 都重定向，可以这样写：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ <span class="nb">command</span> &lt; file1 &gt;file2
</span></span></code></pre></td></tr></table>
</div>
</div><p>command 命令将 stdin 重定向到 file1，将 stdout 重定向到 file2。</p>
<h4 id="here-document">Here Document</h4>
<p>Here Document 是 Shell 中的一种特殊的重定向方式，用来将输入重定向到一个交互式 Shell 脚本或程序。</p>
<p>它的基本的形式如下：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">command</span> <span class="s">&lt;&lt; delimiter
</span></span></span><span class="line"><span class="cl"><span class="s">    document
</span></span></span><span class="line"><span class="cl"><span class="s">delimiter</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。</p>
<blockquote>
<ul>
<li>结尾的 delimiter 一定要顶格写，前面不能有任何字符，后面也不能有任何字符，包括空格和 tab 缩进。</li>
<li>开始的 delimiter 前后的空格会被忽略掉。</li>
</ul>
</blockquote>
<p>例如，在命令行中通过 wc -l 命令计算 Here Document 的行数：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ wc -l <span class="s">&lt;&lt; EOF
</span></span></span><span class="line"><span class="cl"><span class="s">    欢迎来到
</span></span></span><span class="line"><span class="cl"><span class="s">    菜鸟教程
</span></span></span><span class="line"><span class="cl"><span class="s">    www.runoob.com
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span><span class="line"><span class="cl"><span class="m">3</span>          <span class="c1">## 输出结果为 3 行</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="devnull-文件">/dev/null 文件</h4>
<p>如果希望执行某个命令，但又不希望在屏幕上显示输出结果，那么可以将输出重定向到 /dev/null：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ <span class="nb">command</span> &gt; /dev/null
</span></span></code></pre></td></tr></table>
</div>
</div><p>/dev/null 是一个特殊的文件，写入到它的内容都会被丢弃；如果尝试从该文件读取内容，那么什么也读不到。但是 /dev/null 文件非常有用，将命令的输出重定向到它，会起到&quot;禁止输出&quot;的效果。</p>
<p>如果希望屏蔽 stdout 和 stderr，可以这样写：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ <span class="nb">command</span> &gt; /dev/null 2&gt;<span class="p">&amp;</span><span class="m">1</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="参考文献">参考文献</h2>
<ul>
<li><a href="https://www.runoob.com/linux/linux-shell.html" target="_blank" rel="noopener noreffer">Shell 教程|菜鸟教程</a></li>
</ul>
]]></content:encoded></item><item><title>数据库笔记 02 - MySQL 函数</title><link>https://philohao.com/2020/02/20200218/</link><pubDate>Tue, 18 Feb 2020 23:46:13 +0800</pubDate><dc:creator>Jianfeng.Hao</dc:creator><author>haojianfeng1997@gmail.com (Jianfeng.Hao)</author><guid isPermaLink="true">https://philohao.com/2020/02/20200218/</guid><description>MySQL 函数学习笔记，整理空值处理、字符串、日期和聚合函数用法。</description><content:encoded><![CDATA[<h2 id="mysql-常用函数">MySQL 常用函数</h2>
<h3 id="null-函数">NULL 函数</h3>
<p>ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数</p>
<h3 id="日期函数">日期函数</h3>
<p>MySQL 使用下列数据类型在数据库中存储日期或日期/时间值：</p>
<ul>
<li>DATE - 格式：YYYY-MM-DD</li>
<li>DATETIME - 格式：YYYY-MM-DD HH:MM:SS</li>
<li>TIMESTAMP - 格式：YYYY-MM-DD HH:MM:SS</li>
<li>YEAR - 格式：YYYY 或 YY</li>
</ul>
<table>
<thead>
<tr>
<th style="text-align:left">函数</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><a href="https://www.runoob.com/sql/func-now.html" target="_blank" rel="noopener noreffer">NOW()</a></td>
<td style="text-align:left">返回当前的日期和时间</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://www.runoob.com/sql/func-curdate.html" target="_blank" rel="noopener noreffer">CURDATE()</a></td>
<td style="text-align:left">返回当前的日期</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://www.runoob.com/sql/func-curtime.html" target="_blank" rel="noopener noreffer">CURTIME()</a></td>
<td style="text-align:left">返回当前的时间</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://www.runoob.com/sql/func-date.html" target="_blank" rel="noopener noreffer">DATE()</a></td>
<td style="text-align:left">提取日期或日期/时间表达式的日期部分</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://www.runoob.com/sql/func-extract.html" target="_blank" rel="noopener noreffer">EXTRACT()</a></td>
<td style="text-align:left">返回日期/时间的单独部分</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://www.runoob.com/sql/func-date-add.html" target="_blank" rel="noopener noreffer">DATE_ADD()</a></td>
<td style="text-align:left">向日期添加指定的时间间隔</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://www.runoob.com/sql/func-date-sub.html" target="_blank" rel="noopener noreffer">DATE_SUB()</a></td>
<td style="text-align:left">从日期减去指定的时间间隔</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://www.runoob.com/sql/func-datediff-mysql.html" target="_blank" rel="noopener noreffer">DATEDIFF()</a></td>
<td style="text-align:left">返回两个日期之间的天数</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://www.runoob.com/sql/func-date-format.html" target="_blank" rel="noopener noreffer">DATE_FORMAT()</a></td>
<td style="text-align:left">用不同的格式显示日期/时间</td>
</tr>
</tbody>
</table>
<h3 id="aggregate-函数">Aggregate 函数</h3>
<p>SQL Aggregate 函数计算从列中取得的值，返回一个单一的值。</p>
<table>
<thead>
<tr>
<th>函数</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>AVG()</td>
<td>返回平均值</td>
</tr>
<tr>
<td>COUNT()</td>
<td>返回行数</td>
</tr>
<tr>
<td>FIRST()</td>
<td>返回第一个记录的值</td>
</tr>
<tr>
<td>LAST()</td>
<td>返回最后一个记录的值</td>
</tr>
<tr>
<td>MAX()</td>
<td>返回最大值</td>
</tr>
<tr>
<td>MIN()</td>
<td>返回最小值</td>
</tr>
<tr>
<td>SUM()</td>
<td>返回总和</td>
</tr>
</tbody>
</table>
<h3 id="scalar-函数">Scalar 函数</h3>
<p>SQL Scalar 函数基于输入值，返回一个单一的值。</p>
<table>
<thead>
<tr>
<th>函数</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>UCASE()</td>
<td>将某个字段转换为大写</td>
</tr>
<tr>
<td>LCASE()</td>
<td>将某个字段转换为小写</td>
</tr>
<tr>
<td>MID()</td>
<td>从某个文本字段提取字符，MySql 中使用</td>
</tr>
<tr>
<td>SubString(字段，1，end)</td>
<td>从某个文本字段提取字符</td>
</tr>
<tr>
<td>LEN()</td>
<td>返回某个文本字段的长度</td>
</tr>
<tr>
<td>ROUND()</td>
<td>对某个数值字段进行指定小数位数的四舍五入</td>
</tr>
<tr>
<td>NOW()</td>
<td>返回当前的系统日期和时间</td>
</tr>
<tr>
<td>FORMAT()</td>
<td>格式化某个字段的显示方式</td>
</tr>
</tbody>
</table>
<p>有关上述函数的具体使用，可以参考：<a href="https://www.runoob.com/sql/sql-function.html" target="_blank" rel="noopener noreffer">https://www.runoob.com/sql/sql-function.html</a></p>
]]></content:encoded></item><item><title>数据库笔记 01 - SQL 语法篇</title><link>https://philohao.com/2020/02/20200217/</link><pubDate>Mon, 17 Feb 2020 22:28:47 +0800</pubDate><dc:creator>Jianfeng.Hao</dc:creator><author>haojianfeng1997@gmail.com (Jianfeng.Hao)</author><guid isPermaLink="true">https://philohao.com/2020/02/20200217/</guid><description>SQL 语法学习笔记，概览关系型数据库常用操作和语句分类。</description><content:encoded><![CDATA[<p>SQL（Structured Query Language）是「结构化查询语言」，它是对关系型数据库的操作语言。它可以应用到所有关系型数据库中，例如：MySQL、Oracle、SQL Server 等。它主要划分为以下几类：</p>
<ul>
<li><strong>DQL - Data Query Language</strong>：数据查询语言，用来查询记录（数据）。<u>select</u></li>
<li><strong>DDL - Data Definition Language</strong>：数据定义语言，用来定义数据库对象；<u>create/drop/alter</u></li>
<li><strong>DML - Data Manipulation Language</strong>：数据操作语言，用来定义数据库记录；<u>Insert/delete/update</u></li>
<li><strong>DCL - Data Control Language</strong>：数据控制语言，用来定义访问权限和安全级别；</li>
</ul>
<h2 id="dql数据查询语言">DQL：数据查询语言</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w"> </span><span class="p">[</span><span class="k">DISTINCT</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="o">&lt;</span><span class="n">select_list</span><span class="o">&gt;</span><span class="w"> </span><span class="cm">/*要查询的列名称*/</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">FROM</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="o">&lt;</span><span class="n">left_table</span><span class="o">&gt;</span><span class="w"> </span><span class="o">&lt;</span><span class="n">join_type</span><span class="o">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="k">JOIN</span><span class="w"> </span><span class="o">&lt;</span><span class="n">right_table</span><span class="o">&gt;</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="o">&lt;</span><span class="n">join_condition</span><span class="o">&gt;</span><span class="cm">/*要查询的表名称*/</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">WHERE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="o">&lt;</span><span class="n">where_condition</span><span class="o">&gt;</span><span class="w"> </span><span class="cm">/*行条件*/</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">GROUP</span><span class="w"> </span><span class="k">BY</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="o">&lt;</span><span class="n">group_by_list</span><span class="o">&gt;</span><span class="w"> </span><span class="cm">/*对结果分组*/</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">HAVING</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="o">&lt;</span><span class="n">having_condition</span><span class="o">&gt;</span><span class="w"> </span><span class="cm">/*分组后的行条件*/</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="o">&lt;</span><span class="n">sorting_columns</span><span class="o">&gt;</span><span class="w"> </span><span class="p">[</span><span class="k">ASC</span><span class="o">|</span><span class="k">DESC</span><span class="p">]</span><span class="w"> </span><span class="cm">/*对结果排序*/</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">LIMIT</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="o">&lt;</span><span class="n">offset_start</span><span class="p">,</span><span class="w"> </span><span class="n">row_length</span><span class="o">&gt;</span><span class="w"> </span><span class="cm">/*结果限定*/</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="mysql---执行顺序">MySQL - 执行顺序</h3>
<p>随着 Mysql 版本的更新换代，其优化器也在不断的升级，优化器会分析不同执行顺序产生的性能消耗不同而动态调整 <code>执行顺序</code>。下面是经常出现的查询顺序：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">FROM</span><span class="w"> </span><span class="o">&lt;</span><span class="n">left_table</span><span class="o">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">ON</span><span class="w"> </span><span class="o">&lt;</span><span class="n">join_condition</span><span class="o">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">&lt;</span><span class="n">join_type</span><span class="o">&gt;</span><span class="w"> </span><span class="k">JOIN</span><span class="w"> </span><span class="o">&lt;</span><span class="n">right_table</span><span class="o">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">WHERE</span><span class="w"> </span><span class="o">&lt;</span><span class="n">where_condition</span><span class="o">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">GROUP</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="o">&lt;</span><span class="n">group_by_list</span><span class="o">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">HAVING</span><span class="w"> </span><span class="o">&lt;</span><span class="n">having_condition</span><span class="o">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">SELECT</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">[</span><span class="k">DISTINCT</span><span class="p">]</span><span class="w"> </span><span class="o">&lt;</span><span class="n">select_list</span><span class="o">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="o">&lt;</span><span class="n">sorting_columns</span><span class="o">&gt;</span><span class="w"> </span><span class="p">[</span><span class="k">ASC</span><span class="o">|</span><span class="k">DESC</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">LIMIT</span><span class="w"> </span><span class="o">&lt;</span><span class="n">offset_start</span><span class="p">,</span><span class="w"> </span><span class="n">row_length</span><span class="o">&gt;</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="condition---行筛选条件">Condition - 行筛选条件</h3>
<h4 id="in---多值匹配">IN - 多值匹配</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w"> </span><span class="k">column_name</span><span class="p">(</span><span class="n">s</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">FROM</span><span class="w"> </span><span class="k">table_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">WHERE</span><span class="w"> </span><span class="k">column_name</span><span class="w"> </span><span class="k">IN</span><span class="w"> </span><span class="p">(</span><span class="n">value1</span><span class="p">,</span><span class="n">value2</span><span class="p">,...);</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><h4 id="like---字符匹配">LIKE - 字符匹配</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w"> </span><span class="k">column_name</span><span class="p">(</span><span class="n">s</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">FROM</span><span class="w"> </span><span class="k">table_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">WHERE</span><span class="w"> </span><span class="k">column_name</span><span class="w"> </span><span class="k">LIKE</span><span class="w"> </span><span class="n">pattern</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><table>
<thead>
<tr>
<th style="text-align:left">通配符</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">%</td>
<td style="text-align:left">替代 0 个或多个字符</td>
</tr>
<tr>
<td style="text-align:left">_</td>
<td style="text-align:left">替代一个字符</td>
</tr>
<tr>
<td style="text-align:left">[<em>charlist</em>]</td>
<td style="text-align:left">字符列中的任何单一字符</td>
</tr>
<tr>
<td style="text-align:left">[^<em>charlist</em>] 或 [!<em>charlist</em>]</td>
<td style="text-align:left">不在字符列中的任何单一字符</td>
</tr>
</tbody>
</table>
<h4 id="between---范围匹配">BETWEEN - 范围匹配</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w"> </span><span class="k">column_name</span><span class="p">(</span><span class="n">s</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">FROM</span><span class="w"> </span><span class="k">table_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">WHERE</span><span class="w"> </span><span class="k">column_name</span><span class="w"> </span><span class="k">BETWEEN</span><span class="w"> </span><span class="n">value1</span><span class="w"> </span><span class="k">AND</span><span class="w"> </span><span class="n">value2</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<ul>
<li><strong>AND &amp; OR 运算符</strong></li>
</ul>
<p>如果第一个条件和第二个条件都成立，则 AND 运算符显示一条记录。</p>
<p>如果第一个条件和第二个条件中只要有一个成立，则 OR 运算符显示一条记录。</p>
</blockquote>
<h3 id="having---分组筛选">HAVING - 分组筛选</h3>
<p>在 SQL 中增加 <code>HAVING</code> 子句原因是，<code>WHERE</code> 关键字无法与聚合函数 <code>GROUP BY</code> 一起使用。<code>HAVING</code> 子句可以让我们筛选分组后的各组数据。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w"> </span><span class="k">column_name</span><span class="p">,</span><span class="w"> </span><span class="n">aggregate_function</span><span class="p">(</span><span class="k">column_name</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">FROM</span><span class="w"> </span><span class="k">table_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">WHERE</span><span class="w"> </span><span class="k">column_name</span><span class="w"> </span><span class="k">operator</span><span class="w"> </span><span class="n">value</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">GROUP</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="k">column_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">HAVING</span><span class="w"> </span><span class="n">aggregate_function</span><span class="p">(</span><span class="k">column_name</span><span class="p">)</span><span class="w"> </span><span class="k">operator</span><span class="w"> </span><span class="n">value</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="toplimitrownum---结果限定">TOP/LIMIT/ROWNUM - 结果限定</h3>
<ul>
<li>SQL Server / MS Access 语法</li>
</ul>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w"> </span><span class="n">TOP</span><span class="w"> </span><span class="nb">number</span><span class="o">|</span><span class="n">percent</span><span class="w"> </span><span class="k">column_name</span><span class="p">(</span><span class="n">s</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">FROM</span><span class="w"> </span><span class="k">table_name</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li>Oracle 语法</li>
</ul>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w"> </span><span class="k">column_name</span><span class="p">(</span><span class="n">s</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">FROM</span><span class="w"> </span><span class="k">table_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">WHERE</span><span class="w"> </span><span class="n">ROWNUM</span><span class="w"> </span><span class="o">&lt;=</span><span class="w"> </span><span class="nb">number</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li>MySQL 语法</li>
</ul>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w"> </span><span class="k">column_name</span><span class="p">(</span><span class="n">s</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">FROM</span><span class="w"> </span><span class="k">table_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">LIMIT</span><span class="w"> </span><span class="nb">number</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>附注：<strong>OFFSET</strong></p>
<p>为了与 PostgreSQL 兼容，MySQL 也支持句法： <code>LIMIT # OFFSET #</code></p>
<ol>
<li>
<p>selete * from testtable limit 2,1;</p>
</li>
<li>
<p>selete * from testtable limit 2 offset 1;</p>
</li>
</ol>
<p><strong>注意：</strong></p>
<ol>
<li>
<p>数据库数据计算是从 0 开始的</p>
</li>
<li>
<p>offset X 是跳过 X 个数据，limit Y 是选取 Y 个数据</p>
</li>
<li>
<p>limit X, Y 中 X 表示跳过 X 个数据，读取 Y 个数据</p>
</li>
</ol>
</blockquote>
<h3 id="as---别名">AS - 别名</h3>
<ul>
<li>列的 SQL 别名语法</li>
</ul>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w"> </span><span class="k">column_name</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">alias_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">FROM</span><span class="w"> </span><span class="k">table_name</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li>表的 SQL 别名语法</li>
</ul>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w"> </span><span class="k">column_name</span><span class="p">(</span><span class="n">s</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">FROM</span><span class="w"> </span><span class="k">table_name</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">alias_name</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p><strong>在下面的情况下，使用别名很有用：</strong></p>
<ol>
<li>
<p>在查询中涉及超过一个表</p>
</li>
<li>
<p>在查询中使用了函数</p>
</li>
<li>
<p>列名称很长或者可读性差</p>
</li>
<li>
<p>需要把两个列或者多个列结合在一起</p>
</li>
</ol>
</blockquote>
<h3 id="join---多表连接">JOIN - 多表连接</h3>
<p><img
        class="lazyload"
        data-src="https://www.runoob.com/wp-content/uploads/2019/01/sql-join.png"
        data-srcset="https://www.runoob.com/wp-content/uploads/2019/01/sql-join.png, https://www.runoob.com/wp-content/uploads/2019/01/sql-join.png 1.5x, https://www.runoob.com/wp-content/uploads/2019/01/sql-join.png 2x"
        data-sizes="auto"
        alt="https://www.runoob.com/wp-content/uploads/2019/01/sql-join.png"
        title="sql-join.png"
    /></p>
<blockquote>
<p><strong>SQL JOIN 语法：</strong></p>
<ol>
<li>
<p>INNER JOIN：如果表中有至少一个匹配，则返回行</p>
</li>
<li>
<p>LEFT JOIN：即使右表中没有匹配，也从左表返回所有的行</p>
</li>
<li>
<p>RIGHT JOIN：即使左表中没有匹配，也从右表返回所有的行</p>
</li>
<li>
<p>FULL JOIN：只要其中一个表中存在匹配，则返回行</p>
</li>
</ol>
</blockquote>
<h3 id="auto-increment---自增序列">AUTO INCREMENT - 自增序列</h3>
<p>在每次插入新记录时，自动地创建主键字段的值。</p>
<p>下面的 SQL 语句把 &ldquo;Persons&rdquo; 表中的 &ldquo;ID&rdquo; 列定义为 auto-increment 主键字段：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">ID</span><span class="w"> </span><span class="nb">int</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="w"> </span><span class="n">AUTO_INCREMENT</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">LastName</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">FirstName</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">Address</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">City</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">PRIMARY</span><span class="w"> </span><span class="k">KEY</span><span class="w"> </span><span class="p">(</span><span class="n">ID</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>MySQL 使用 AUTO_INCREMENT 关键字来执行 auto-increment 任务。</p>
<p>默认地，AUTO_INCREMENT 的开始值是 1，每条新记录递增 1。</p>
<p>要让 AUTO_INCREMENT 序列以其他的值起始，请使用下面的 SQL 语法：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w"> </span><span class="n">AUTO_INCREMENT</span><span class="o">=</span><span class="mi">100</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>要在 &ldquo;Persons&rdquo; 表中插入新记录，我们不必为 &ldquo;ID&rdquo; 列规定值（会自动添加一个唯一的值）：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">INSERT</span><span class="w"> </span><span class="k">INTO</span><span class="w"> </span><span class="n">Persons</span><span class="w"> </span><span class="p">(</span><span class="n">FirstName</span><span class="p">,</span><span class="n">LastName</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">VALUES</span><span class="w"> </span><span class="p">(</span><span class="s1">&#39;Lars&#39;</span><span class="p">,</span><span class="s1">&#39;Monsen&#39;</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="dml数据操作语言">DML：数据操作语言</h2>
<h3 id="insert-into---插入纪录">INSERT INTO - 插入纪录</h3>
<p>有两种编写形式，第一种形式无需指定要插入数据的列名，只需提供被插入的值即可：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">INSERT</span><span class="w"> </span><span class="k">INTO</span><span class="w"> </span><span class="k">table_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">VALUES</span><span class="w"> </span><span class="p">(</span><span class="n">value1</span><span class="p">,</span><span class="n">value2</span><span class="p">,</span><span class="n">value3</span><span class="p">,...);</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>第二种形式需要指定列名及被插入的值：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">INSERT</span><span class="w"> </span><span class="k">INTO</span><span class="w"> </span><span class="k">table_name</span><span class="w"> </span><span class="p">(</span><span class="n">column1</span><span class="p">,</span><span class="n">column2</span><span class="p">,</span><span class="n">column3</span><span class="p">,...)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">VALUES</span><span class="w"> </span><span class="p">(</span><span class="n">value1</span><span class="p">,</span><span class="n">value2</span><span class="p">,</span><span class="n">value3</span><span class="p">,...);</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li><strong>insert into select 和 select into from 的区别</strong></li>
</ul>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="c1">--插入一行,要求表scorebak 必须存在
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">insert</span><span class="w"> </span><span class="k">into</span><span class="w"> </span><span class="n">scorebak</span><span class="w"> </span><span class="k">select</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="n">socre</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">neza</span><span class="o">=</span><span class="s1">&#39;neza&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">--也是插入一行,要求表scorebak 不存在
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">select</span><span class="w"> </span><span class="o">*</span><span class="w">  </span><span class="k">into</span><span class="w"> </span><span class="n">scorebak</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="n">score</span><span class="w">  </span><span class="k">where</span><span class="w"> </span><span class="n">neza</span><span class="o">=</span><span class="s1">&#39;neza&#39;</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="update---更新记录">UPDATE - 更新记录</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">UPDATE</span><span class="w"> </span><span class="k">table_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">SET</span><span class="w"> </span><span class="n">column1</span><span class="o">=</span><span class="n">value1</span><span class="p">,</span><span class="n">column2</span><span class="o">=</span><span class="n">value2</span><span class="p">,...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">WHERE</span><span class="w"> </span><span class="n">some_column</span><span class="o">=</span><span class="n">some_value</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p><strong>请注意 SQL UPDATE 语句中的 WHERE 子句！</strong></p>
<p>WHERE 子句规定哪条记录或者哪些记录需要更新。如果您省略了 WHERE 子句，所有的记录都将被更新！</p>
</blockquote>
<h3 id="delete---删除记录">DELETE - 删除记录</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">DELETE</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="k">table_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">WHERE</span><span class="w"> </span><span class="n">some_column</span><span class="o">=</span><span class="n">some_value</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p><strong>请注意 SQL DELETE 语句中的 WHERE 子句！</strong></p>
<p>WHERE 子句规定哪条记录或者哪些记录需要删除。</p>
<p>如果您省略了 WHERE 子句，所有的记录都将被删除！当然，这意味着表结构、属性、索引将保持不变。</p>
</blockquote>
<hr>
<h2 id="ddl数据定义语言">DDL：数据定义语言</h2>
<h3 id="create-database---创建数据库">CREATE DATABASE - 创建数据库</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">CREATE</span><span class="w"> </span><span class="k">DATABASE</span><span class="w"> </span><span class="n">dbname</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="create-table---创建数据表">CREATE TABLE - 创建数据表</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="k">table_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">column_name1</span><span class="w"> </span><span class="n">data_type</span><span class="p">(</span><span class="k">size</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">column_name2</span><span class="w"> </span><span class="n">data_type</span><span class="p">(</span><span class="k">size</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">column_name3</span><span class="w"> </span><span class="n">data_type</span><span class="p">(</span><span class="k">size</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">....</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">);</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li>column_name 参数规定表中列的名称。</li>
<li>data_type 参数规定列的数据类型（例如 varchar、integer、decimal、date 等等）。</li>
<li>size 参数规定表中列的最大长度。</li>
</ul>
<blockquote>
<p>**提示：**如需了解 MySQL 和 SQL Server 中的数据类型，可以访问：<a href="https://www.runoob.com/sql/sql-datatypes.html" target="_blank" rel="noopener noreffer">数据类型参考手册</a></p>
</blockquote>
<h4 id="constraints---约束规则">Constraints - 约束规则</h4>
<ul>
<li>SQL CREATE TABLE + CONSTRAINT 语法</li>
</ul>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="k">table_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">column_name1</span><span class="w"> </span><span class="n">data_type</span><span class="p">(</span><span class="k">size</span><span class="p">)</span><span class="w"> </span><span class="k">constraint_name</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">column_name2</span><span class="w"> </span><span class="n">data_type</span><span class="p">(</span><span class="k">size</span><span class="p">)</span><span class="w"> </span><span class="k">constraint_name</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">column_name3</span><span class="w"> </span><span class="n">data_type</span><span class="p">(</span><span class="k">size</span><span class="p">)</span><span class="w"> </span><span class="k">constraint_name</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">....</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">);</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>在 SQL 中，我们有如下约束：</p>
<ul>
<li>
<p><strong>NOT NULL</strong> - 指示某列不能存储 NULL 值</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">ID</span><span class="w"> </span><span class="nb">int</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">LastName</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">FirstName</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">Age</span><span class="w"> </span><span class="nb">int</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- 添加 NOT NULL 约束
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">MODIFY</span><span class="w"> </span><span class="n">Age</span><span class="w"> </span><span class="nb">int</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- 删除 NOT NULL 约束
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">MODIFY</span><span class="w"> </span><span class="n">Age</span><span class="w"> </span><span class="nb">int</span><span class="w"> </span><span class="k">NULL</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><strong>UNIQUE</strong> - 保证某列的每行必须有唯一的值</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="c1">-- CREATE TABLE 时的 SQL UNIQUE 约束
</span></span></span><span class="line"><span class="cl"><span class="c1">-- MySQL：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">P_Id</span><span class="w"> </span><span class="nb">int</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">LastName</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">FirstName</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">Address</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">City</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">UNIQUE</span><span class="w"> </span><span class="p">(</span><span class="n">P_Id</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- SQL Server / Oracle / MS Access：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">P_Id</span><span class="w"> </span><span class="nb">int</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="w"> </span><span class="k">UNIQUE</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">LastName</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">FirstName</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">Address</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">City</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- 多个列的 UNIQUE 约束
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">P_Id</span><span class="w"> </span><span class="nb">int</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">LastName</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">FirstName</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">Address</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">City</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">CONSTRAINT</span><span class="w"> </span><span class="n">uc_PersonID</span><span class="w"> </span><span class="k">UNIQUE</span><span class="w"> </span><span class="p">(</span><span class="n">P_Id</span><span class="p">,</span><span class="n">LastName</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- uc_PersonID 是一个约束名！上面建的是唯一约束，为了方便区别约束名一般起得有规律点。
</span></span></span><span class="line"><span class="cl"><span class="c1">-- 比如 UC（就是 UNIQUE CONSTRAINT 的缩写意思是唯一约束）
</span></span></span><span class="line"><span class="cl"><span class="c1">-- uc_PersonID 就是对表中的PersonID 建唯一约束，强制约束 Id_P 和 LastName 唯一。
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- ALTER TABLE 时的 SQL UNIQUE 约束
</span></span></span><span class="line"><span class="cl"><span class="c1">-- MySQL / SQL Server / Oracle / MS Access：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">ADD</span><span class="w"> </span><span class="k">UNIQUE</span><span class="w"> </span><span class="p">(</span><span class="n">P_Id</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- 多个列的 UNIQUE 约束
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">ADD</span><span class="w"> </span><span class="k">CONSTRAINT</span><span class="w"> </span><span class="n">uc_PersonID</span><span class="w"> </span><span class="k">UNIQUE</span><span class="w"> </span><span class="p">(</span><span class="n">P_Id</span><span class="p">,</span><span class="n">LastName</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- 撤销 UNIQUE 约束
</span></span></span><span class="line"><span class="cl"><span class="c1">-- MySQL：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">DROP</span><span class="w"> </span><span class="k">INDEX</span><span class="w"> </span><span class="n">uc_PersonID</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- SQL Server / Oracle / MS Access：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">DROP</span><span class="w"> </span><span class="k">CONSTRAINT</span><span class="w"> </span><span class="n">uc_PersonID</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><strong>PRIMARY KEY</strong> - NOT NULL 和 UNIQUE 的结合</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="c1">-- CREATE TABLE 时的 SQL PRIMARY KEY 约束
</span></span></span><span class="line"><span class="cl"><span class="c1">-- MySQL：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">P_Id</span><span class="w"> </span><span class="nb">int</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">LastName</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">FirstName</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">Address</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">City</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">PRIMARY</span><span class="w"> </span><span class="k">KEY</span><span class="w"> </span><span class="p">(</span><span class="n">P_Id</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- SQL Server / Oracle / MS Access：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">P_Id</span><span class="w"> </span><span class="nb">int</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="w"> </span><span class="k">PRIMARY</span><span class="w"> </span><span class="k">KEY</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">LastName</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">FirstName</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">Address</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">City</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- 定义多个列的 PRIMARY KEY 约束：
</span></span></span><span class="line"><span class="cl"><span class="c1">-- 注释：在下面的实例中，只有一个主键 PRIMARY KEY（pk_PersonID）。
</span></span></span><span class="line"><span class="cl"><span class="c1">-- 然而，pk_PersonID 的值是由两个列（P_Id 和 LastName）组成的。
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">P_Id</span><span class="w"> </span><span class="nb">int</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">LastName</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">FirstName</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">Address</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">City</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">CONSTRAINT</span><span class="w"> </span><span class="n">pk_PersonID</span><span class="w"> </span><span class="k">PRIMARY</span><span class="w"> </span><span class="k">KEY</span><span class="w"> </span><span class="p">(</span><span class="n">P_Id</span><span class="p">,</span><span class="n">LastName</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- ALTER TABLE 时的 SQL PRIMARY KEY 约束
</span></span></span><span class="line"><span class="cl"><span class="c1">-- 注释：如果您使用 ALTER TABLE 语句添加主键，必须把主键列声明为不包含 NULL 值（在表首次创建时）。
</span></span></span><span class="line"><span class="cl"><span class="c1">-- MySQL / SQL Server / Oracle / MS Access：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">ADD</span><span class="w"> </span><span class="k">PRIMARY</span><span class="w"> </span><span class="k">KEY</span><span class="w"> </span><span class="p">(</span><span class="n">P_Id</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- 定义多个列的 PRIMARY KEY 约束：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">ADD</span><span class="w"> </span><span class="k">CONSTRAINT</span><span class="w"> </span><span class="n">pk_PersonID</span><span class="w"> </span><span class="k">PRIMARY</span><span class="w"> </span><span class="k">KEY</span><span class="w"> </span><span class="p">(</span><span class="n">P_Id</span><span class="p">,</span><span class="n">LastName</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- 撤销 PRIMARY KEY 约束
</span></span></span><span class="line"><span class="cl"><span class="c1">-- MySQL：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">DROP</span><span class="w"> </span><span class="k">PRIMARY</span><span class="w"> </span><span class="k">KEY</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- SQL Server / Oracle / MS Access：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">DROP</span><span class="w"> </span><span class="k">CONSTRAINT</span><span class="w"> </span><span class="n">pk_PersonID</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><strong>FOREIGN KEY</strong> - 保证一个表中的数据匹配另一个表中的值的参照完整性</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="c1">-- CREATE TABLE 时的 SQL PRIMARY KEY 约束
</span></span></span><span class="line"><span class="cl"><span class="c1">-- MySQL：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Orders</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">O_Id</span><span class="w"> </span><span class="nb">int</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">OrderNo</span><span class="w"> </span><span class="nb">int</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">P_Id</span><span class="w"> </span><span class="nb">int</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">PRIMARY</span><span class="w"> </span><span class="k">KEY</span><span class="w"> </span><span class="p">(</span><span class="n">O_Id</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">FOREIGN</span><span class="w"> </span><span class="k">KEY</span><span class="w"> </span><span class="p">(</span><span class="n">P_Id</span><span class="p">)</span><span class="w"> </span><span class="k">REFERENCES</span><span class="w"> </span><span class="n">Persons</span><span class="p">(</span><span class="n">P_Id</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- SQL Server / Oracle / MS Access：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Orders</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">O_Id</span><span class="w"> </span><span class="nb">int</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="w"> </span><span class="k">PRIMARY</span><span class="w"> </span><span class="k">KEY</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">OrderNo</span><span class="w"> </span><span class="nb">int</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">P_Id</span><span class="w"> </span><span class="nb">int</span><span class="w"> </span><span class="k">FOREIGN</span><span class="w"> </span><span class="k">KEY</span><span class="w"> </span><span class="k">REFERENCES</span><span class="w"> </span><span class="n">Persons</span><span class="p">(</span><span class="n">P_Id</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- 定义多个列的 PRIMARY KEY 约束：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Orders</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">O_Id</span><span class="w"> </span><span class="nb">int</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">OrderNo</span><span class="w"> </span><span class="nb">int</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">P_Id</span><span class="w"> </span><span class="nb">int</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">PRIMARY</span><span class="w"> </span><span class="k">KEY</span><span class="w"> </span><span class="p">(</span><span class="n">O_Id</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">CONSTRAINT</span><span class="w"> </span><span class="n">fk_PerOrders</span><span class="w"> </span><span class="k">FOREIGN</span><span class="w"> </span><span class="k">KEY</span><span class="w"> </span><span class="p">(</span><span class="n">P_Id</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">REFERENCES</span><span class="w"> </span><span class="n">Persons</span><span class="p">(</span><span class="n">P_Id</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- ALTER TABLE 时的 SQL PRIMARY KEY 约束
</span></span></span><span class="line"><span class="cl"><span class="c1">-- MySQL / SQL Server / Oracle / MS Access：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Orders</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">ADD</span><span class="w"> </span><span class="k">FOREIGN</span><span class="w"> </span><span class="k">KEY</span><span class="w"> </span><span class="p">(</span><span class="n">P_Id</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">REFERENCES</span><span class="w"> </span><span class="n">Persons</span><span class="p">(</span><span class="n">P_Id</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- 定义多个列的 PRIMARY KEY 约束：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Orders</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">ADD</span><span class="w"> </span><span class="k">CONSTRAINT</span><span class="w"> </span><span class="n">fk_PerOrders</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">FOREIGN</span><span class="w"> </span><span class="k">KEY</span><span class="w"> </span><span class="p">(</span><span class="n">P_Id</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">REFERENCES</span><span class="w"> </span><span class="n">Persons</span><span class="p">(</span><span class="n">P_Id</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- 撤销 PRIMARY KEY 约束
</span></span></span><span class="line"><span class="cl"><span class="c1">-- MySQL：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Orders</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">DROP</span><span class="w"> </span><span class="k">FOREIGN</span><span class="w"> </span><span class="k">KEY</span><span class="w"> </span><span class="n">fk_PerOrders</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- SQL Server / Oracle / MS Access：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Orders</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">DROP</span><span class="w"> </span><span class="k">CONSTRAINT</span><span class="w"> </span><span class="n">fk_PerOrders</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><strong>CHECK</strong> - 保证列中的值符合指定的条件</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="c1">-- CREATE TABLE 时的 SQL PRIMARY KEY 约束
</span></span></span><span class="line"><span class="cl"><span class="c1">-- MySQL：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">P_Id</span><span class="w"> </span><span class="nb">int</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">LastName</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">FirstName</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">Address</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">City</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">CHECK</span><span class="w"> </span><span class="p">(</span><span class="n">P_Id</span><span class="o">&gt;</span><span class="mi">0</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- SQL Server / Oracle / MS Access：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">P_Id</span><span class="w"> </span><span class="nb">int</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="w"> </span><span class="k">CHECK</span><span class="w"> </span><span class="p">(</span><span class="n">P_Id</span><span class="o">&gt;</span><span class="mi">0</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">LastName</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">FirstName</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">Address</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">City</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- 定义多个列的 PRIMARY KEY 约束：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">P_Id</span><span class="w"> </span><span class="nb">int</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">LastName</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">FirstName</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">Address</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">City</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">CONSTRAINT</span><span class="w"> </span><span class="n">chk_Person</span><span class="w"> </span><span class="k">CHECK</span><span class="w"> </span><span class="p">(</span><span class="n">P_Id</span><span class="o">&gt;</span><span class="mi">0</span><span class="w"> </span><span class="k">AND</span><span class="w"> </span><span class="n">City</span><span class="o">=</span><span class="s1">&#39;Sandnes&#39;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- ALTER TABLE 时的 SQL PRIMARY KEY 约束
</span></span></span><span class="line"><span class="cl"><span class="c1">-- MySQL / SQL Server / Oracle / MS Access：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">ADD</span><span class="w"> </span><span class="k">CHECK</span><span class="w"> </span><span class="p">(</span><span class="n">P_Id</span><span class="o">&gt;</span><span class="mi">0</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- 定义多个列的 PRIMARY KEY 约束：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">ADD</span><span class="w"> </span><span class="k">CONSTRAINT</span><span class="w"> </span><span class="n">chk_Person</span><span class="w"> </span><span class="k">CHECK</span><span class="w"> </span><span class="p">(</span><span class="n">P_Id</span><span class="o">&gt;</span><span class="mi">0</span><span class="w"> </span><span class="k">AND</span><span class="w"> </span><span class="n">City</span><span class="o">=</span><span class="s1">&#39;Sandnes&#39;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- 撤销 PRIMARY KEY 约束
</span></span></span><span class="line"><span class="cl"><span class="c1">-- MySQL：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">DROP</span><span class="w"> </span><span class="k">CHECK</span><span class="w"> </span><span class="n">chk_Person</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- SQL Server / Oracle / MS Access：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">DROP</span><span class="w"> </span><span class="k">CONSTRAINT</span><span class="w"> </span><span class="n">chk_Person</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><strong>DEFAULT</strong> - 规定没有给列赋值时的默认值</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="c1">-- CREATE TABLE 时的 SQL PRIMARY KEY 约束
</span></span></span><span class="line"><span class="cl"><span class="c1">-- My SQL / SQL Server / Oracle / MS Access：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">P_Id</span><span class="w"> </span><span class="nb">int</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">LastName</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">FirstName</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">Address</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">City</span><span class="w"> </span><span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span><span class="w"> </span><span class="k">DEFAULT</span><span class="w"> </span><span class="s1">&#39;Sandnes&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- ALTER TABLE 时的 SQL PRIMARY KEY 约束
</span></span></span><span class="line"><span class="cl"><span class="c1">-- MySQL：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">ALTER</span><span class="w"> </span><span class="n">City</span><span class="w"> </span><span class="k">SET</span><span class="w"> </span><span class="k">DEFAULT</span><span class="w"> </span><span class="s1">&#39;SANDNES&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- SQL Server / MS Access：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">ADD</span><span class="w"> </span><span class="k">CONSTRAINT</span><span class="w"> </span><span class="n">ab_c</span><span class="w"> </span><span class="k">DEFAULT</span><span class="w"> </span><span class="s1">&#39;SANDNES&#39;</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">City</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- Oracle：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">MODIFY</span><span class="w"> </span><span class="n">City</span><span class="w"> </span><span class="k">DEFAULT</span><span class="w"> </span><span class="s1">&#39;SANDNES&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- 撤销 PRIMARY KEY 约束
</span></span></span><span class="line"><span class="cl"><span class="c1">-- MySQL：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">ALTER</span><span class="w"> </span><span class="n">City</span><span class="w"> </span><span class="k">DROP</span><span class="w"> </span><span class="k">DEFAULT</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- SQL Server / Oracle / MS Access：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">Persons</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">COLUMN</span><span class="w"> </span><span class="n">City</span><span class="w"> </span><span class="k">DROP</span><span class="w"> </span><span class="k">DEFAULT</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div></li>
</ul>
<h3 id="create-index---创建索引">CREATE INDEX - 创建索引</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="c1">-- 在表上创建一个简单的索引，允许使用重复的值：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">CREATE</span><span class="w"> </span><span class="k">INDEX</span><span class="w"> </span><span class="n">index_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">ON</span><span class="w"> </span><span class="k">table_name</span><span class="w"> </span><span class="p">(</span><span class="k">column_name</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- 在表上创建一个唯一的索引，不允许使用重复的值：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">CREATE</span><span class="w"> </span><span class="k">UNIQUE</span><span class="w"> </span><span class="k">INDEX</span><span class="w"> </span><span class="n">index_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">ON</span><span class="w"> </span><span class="k">table_name</span><span class="w"> </span><span class="p">(</span><span class="k">column_name</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- 多列索引，可以在括号中列出这些列的名称，用逗号隔开：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">CREATE</span><span class="w"> </span><span class="k">INDEX</span><span class="w"> </span><span class="n">PIndex</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">ON</span><span class="w"> </span><span class="n">Persons</span><span class="w"> </span><span class="p">(</span><span class="n">LastName</span><span class="p">,</span><span class="w"> </span><span class="n">FirstName</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="alter-table---修改表">ALTER TABLE - 修改表</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="c1">-- 如需在表中添加列，请使用下面的语法:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="k">table_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">ADD</span><span class="w"> </span><span class="k">column_name</span><span class="w"> </span><span class="n">datatype</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- 如需删除表中的列，请使用下面的语法
</span></span></span><span class="line"><span class="cl"><span class="c1">-- （请注意，某些数据库系统不允许这种在数据库表中删除列的方式）：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="k">table_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">DROP</span><span class="w"> </span><span class="k">COLUMN</span><span class="w"> </span><span class="k">column_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- 要改变表中列的数据类型，请使用下面的语法：
</span></span></span><span class="line"><span class="cl"><span class="c1">-- SQL Server / MS Access：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="k">table_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">COLUMN</span><span class="w"> </span><span class="k">column_name</span><span class="w"> </span><span class="n">datatype</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- My SQL / Oracle：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="k">table_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">MODIFY</span><span class="w"> </span><span class="k">COLUMN</span><span class="w"> </span><span class="k">column_name</span><span class="w"> </span><span class="n">datatype</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- Oracle 10G 之后版本:
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="k">table_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">MODIFY</span><span class="w"> </span><span class="k">column_name</span><span class="w"> </span><span class="n">datatype</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="drop---删除">DROP - 删除</h3>
<h4 id="drop-index---撤销索引">DROP INDEX - 撤销索引</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="c1">-- 用于 MS Access 的 DROP INDEX 语法：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">DROP</span><span class="w"> </span><span class="k">INDEX</span><span class="w"> </span><span class="n">index_name</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="k">table_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- 用于 MS SQL Server 的 DROP INDEX 语法：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">DROP</span><span class="w"> </span><span class="k">INDEX</span><span class="w"> </span><span class="k">table_name</span><span class="p">.</span><span class="n">index_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- 用于 DB2/Oracle 的 DROP INDEX 语法：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">DROP</span><span class="w"> </span><span class="k">INDEX</span><span class="w"> </span><span class="n">index_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- 用于 MySQL 的 DROP INDEX 语法：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">ALTER</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="k">table_name</span><span class="w"> </span><span class="k">DROP</span><span class="w"> </span><span class="k">INDEX</span><span class="w"> </span><span class="n">index_name</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><h4 id="drop-table---撤销表">DROP TABLE - 撤销表</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">DROP</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="k">table_name</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><h4 id="drop-database---撤销数据库">DROP DATABASE - 撤销数据库</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">DROP</span><span class="w"> </span><span class="k">DATABASE</span><span class="w"> </span><span class="n">database_name</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div>]]></content:encoded></item><item><title>数据库书摘 01 - 《SQL 必知必会》</title><link>https://philohao.com/2020/02/20200216/</link><pubDate>Sun, 16 Feb 2020 22:28:47 +0800</pubDate><dc:creator>Jianfeng.Hao</dc:creator><author>haojianfeng1997@gmail.com (Jianfeng.Hao)</author><guid isPermaLink="true">https://philohao.com/2020/02/20200216/</guid><description>《SQL 必知必会》读书摘录，整理 SQL 查询、过滤、分组和连接等基础语法。</description><content:encoded><![CDATA[<blockquote>
<p>涉及资源列表：<br>
<a href="https://book.douban.com/subject/24250054/" target="_blank" rel="noopener noreffer">《SQL必知必会》（豆瓣）</a><br>
<a href="https://github.com/xianshenglu/document/blob/master/SQL%E5%BF%85%E7%9F%A5%E5%BF%85%E4%BC%9A-%E4%B8%AD%E6%96%87-%E7%AC%AC4%E7%89%88.pdf" target="_blank" rel="noopener noreffer">PDF 资源（GitHub）</a></p>
</blockquote>
<h2 id="数据查询语句">数据查询语句</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w"> </span><span class="p">[</span><span class="k">DISTINCT</span><span class="o">/</span><span class="k">ALL</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="o">&lt;</span><span class="n">select_list</span><span class="o">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">FROM</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="o">&lt;</span><span class="n">left_table</span><span class="o">&gt;</span><span class="w"> </span><span class="o">&lt;</span><span class="n">join_type</span><span class="o">&gt;</span><span class="w"> </span><span class="k">JOIN</span><span class="w"> </span><span class="o">&lt;</span><span class="n">right_table</span><span class="o">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">ON</span><span class="w"> </span><span class="o">&lt;</span><span class="n">join_condition</span><span class="o">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">WHERE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="o">&lt;</span><span class="n">where_condition</span><span class="o">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">GROUP</span><span class="w"> </span><span class="k">BY</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="o">&lt;</span><span class="n">group_by_list</span><span class="o">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">HAVING</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="o">&lt;</span><span class="n">having_condition</span><span class="o">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="o">&lt;</span><span class="n">sorting_columns</span><span class="o">&gt;</span><span class="w"> </span><span class="p">[</span><span class="k">ASC</span><span class="o">|</span><span class="k">DESC</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">LIMIT</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="o">&lt;</span><span class="n">offset_start</span><span class="p">,</span><span class="w"> </span><span class="n">row_length</span><span class="o">&gt;</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="易错点">易错点</h3>
<ul>
<li>多条 SQL 语句必须以分号（;）作分隔</li>
<li>注释语法 &ndash; 和 /**/，#大多数不行</li>
<li>检索数据（<code>SELECT</code>、<code>LIMIT</code>、<code>ORDER BY</code>）
<ul>
<li>DISTINCT 作用于所有的列，而不仅仅是跟在其后的那一列</li>
<li>与 DISTINCT 不同，DESC 关键字只应用到直接位于其前面的列名</li>
</ul>
</li>
<li>过滤数据（<code>WHERE</code>）
<ul>
<li>由于 AND 操作符比 OR 操作符优先级高，需要使用圆括号对操作符进行明确分组</li>
<li>IN 操作符最大的优点在于可以包含其他 SELECT 语句</li>
<li>通配符搜索只能用于文本字段（字符串），非文本数据类型字段不能使用通配符搜索</li>
<li>通配符 % 代表匹配任意字符，甚至可以匹配 0 个字符，但不可匹配 null</li>
</ul>
</li>
<li>计算字段
<ul>
<li>CONUT() 函数中如果指定列名，则会忽略指定列的值为空 NULL 的行；如果用 * 则不忽略</li>
<li>对于文本数据，MIN() 返回排序后最前面的行， MAX() 返回排序后最后面的行</li>
</ul>
</li>
<li>汇总数据
<ul>
<li>5个聚集函数（AVG、COUNT、MIN、MAX、SUM）都可用于指定 DISTINCT 参数的列，但唯独 COUNT(*) 不可以</li>
</ul>
</li>
<li>分组数据（<code>GROUP BY</code>、<code>HAVING</code>）
<ul>
<li>分组统计：GROUP BY 分组后进行聚集函数运算；分组排序：利用窗口函数及 OVER 子句</li>
<li>除聚集计算语句外，SELECT 语句中的每一列都必须在 GROUP BY 子句中给出</li>
<li>Having 支持所有 Where 操作符，区别在于 having 用于过滤分组，而 where 用于过滤行</li>
</ul>
</li>
<li>子查询
<ul>
<li>两种使用方法
<ul>
<li>WHERE 子句的 IN 操作符中</li>
<li>用来填充计算字段</li>
</ul>
</li>
<li>作为子查询的 SELECT 语句只能查询单个列</li>
</ul>
</li>
<li>联结表：自联结的实现需要用到表别名</li>
<li>组合查询（<code>UNION</code>）
<ul>
<li>UNION 中的每个查询必须包括相同的列、表达式或聚集函数，但各个列不需要以相同的次序列出</li>
<li>UNION 默认会从查询结果中自动去掉重复的行，如果想返回全部的行，可以使用 UNION ALL</li>
<li>在用 UNION 组合查询时，只能使用一条 ORDER BY 子句，它只能位于最后一条 SELECT 语句之后</li>
<li>UNION 在需要组合多个表的数据时也很有用，当列名写法不一致时可以借助别名来实现组合查询，检索到一个结果集</li>
</ul>
</li>
</ul>
<h3 id="背诵点">背诵点</h3>
<ul>
<li>不同平台差异点：
<ul>
<li>限制结果语句 - 不同平台实现起来并不一样——TOP、FETCH、ROWNUM、LIMIT</li>
<li>通配符 #（%/*、_/？、[]、^/!）</li>
<li>拼接字段（+/||）</li>
<li>函数</li>
</ul>
</li>
<li>WHERE 子句的条件操作符（=、&lt;&gt;/!=、&gt;、&lt;、&gt;=/!&lt;、&lt;=/!&gt;、between、is null）、AND/OR/IN/NOT/LIKE 操作符</li>
<li>函数（文本、数值、时间、系统、聚集、窗口）</li>
</ul>
<h2 id="数据操作语言">数据操作语言</h2>
<h2 id="数据定义语言">数据定义语言</h2>
]]></content:encoded></item><item><title>stargazer：R 语言输出统计表</title><link>https://philohao.com/2018/10/20181030/</link><pubDate>Tue, 30 Oct 2018 16:20:03 +0800</pubDate><dc:creator>Jianfeng.Hao</dc:creator><author>haojianfeng1997@gmail.com (Jianfeng.Hao)</author><guid isPermaLink="true">https://philohao.com/2018/10/20181030/</guid><description>stargazer 包使用笔记，记录 R 模型结果和统计表的输出方法。</description><content:encoded><![CDATA[<center>
    <i>
    	使用 stargazer 可以将 R 构建的模型结果以 LATEX 、 HTML 和 ASCII 格式输出，方便我们生成标准格式的表格<br />
    	结合 rmarkdown 来进行使用，会使我们优雅地写出一篇拥有期刊级统计表的文章
    </i>
</center>
<h2 id="简介">简介</h2>
<p>R 包 <code>stargazer</code> 可以将 <strong>数据统计汇总</strong> （格式可以为数据框、向量和矩阵等）和 <strong>统计模型结果</strong> 输出为标准统计表格式的 <code>LATEX</code> 、<code>HTML</code> 和 <code>ASCII</code> 格式的字符文本，<em><strong>将其复制到对应的软件中</strong></em> 即可生成标准的统计表，当然也可以配合 <code>rmarkdown</code> 使用直接渲染输出为表格，更加方便直接。</p>
<h2 id="安装及加载">安装及加载</h2>
<p>可以使用常规方法导入 <code>stargazer</code> 包：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-R" data-lang="R"><span class="line"><span class="cl"><span class="nf">install.packages</span><span class="p">(</span><span class="s">&#34;stargazer&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nf">library</span><span class="p">(</span><span class="n">stargazer</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><div class="note info"><p>
stargazer 包的输出结果是相应格式的，例如输出 LATEX 格式，可以直接将结果粘贴进在线编辑器 [Overleaf](https://www.overleaf.com) 中输出表格。下文直接将结果以对应表格的形式展示。
</p></div>
<hr>
<h2 id="数据统计汇总">数据统计汇总</h2>
<h3 id="统计汇总数据">统计汇总数据</h3>
<p>如果要展示数据集的基本描述性分析数据（由 R 函数 <code>summary</code> 得到），可以使用以下命令直接得到：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-R" data-lang="R"><span class="line"><span class="cl"><span class="nf">stargazer</span><span class="p">(</span><span class="n">attitude</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><img
        class="lazyload"
        data-src="https://static.datartisan.com/upload/attachment/2016/12/qCOW9qcQ.png"
        data-srcset="https://static.datartisan.com/upload/attachment/2016/12/qCOW9qcQ.png, https://static.datartisan.com/upload/attachment/2016/12/qCOW9qcQ.png 1.5x, https://static.datartisan.com/upload/attachment/2016/12/qCOW9qcQ.png 2x"
        data-sizes="auto"
        alt="https://static.datartisan.com/upload/attachment/2016/12/qCOW9qcQ.png"
        title="统计汇总数据"
    /></p>
<h3 id="原始数据展示">原始数据展示</h3>
<p>如果想输出某些数据框的特定行的原始内容，需要指定要查看的数据框的一部分，并将设置参数 <code>summary = FALSE</code>, 如下所示：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-R" data-lang="R"><span class="line"><span class="cl"><span class="nf">data</span><span class="p">(</span><span class="s">&#34;attitude&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nf">stargazer</span><span class="p">(</span><span class="n">attitude[1</span><span class="o">:</span><span class="m">4</span><span class="p">,</span><span class="n">]</span><span class="p">,</span> <span class="n">summary</span> <span class="o">=</span> <span class="kc">FALSE</span><span class="p">,</span> <span class="n">rownames</span> <span class="o">=</span> <span class="kc">TRUE</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><img
        class="lazyload"
        data-src="https://static.datartisan.com/upload/attachment/2016/12/O5nnDnBH.png"
        data-srcset="https://static.datartisan.com/upload/attachment/2016/12/O5nnDnBH.png, https://static.datartisan.com/upload/attachment/2016/12/O5nnDnBH.png 1.5x, https://static.datartisan.com/upload/attachment/2016/12/O5nnDnBH.png 2x"
        data-sizes="auto"
        alt="https://static.datartisan.com/upload/attachment/2016/12/O5nnDnBH.png"
        title="展示数据集"
    /></p>
<p>可以看到，<code>attitude</code> 数据集中包括 <code>rating</code>、<code>complaints</code> 等多个变量，数据展示形式为 <strong>三线表</strong> 。</p>
<h3 id="列联表">列联表</h3>
<p><code>stargazer </code> 也可以用来展示向量、矩阵或者数据框的内容。在这里我们建立了 <code>attitude</code> 数据集中变量 <code>rating</code>、<code>complaints</code>、<code>privileges</code> 的相关系数矩阵，并予以展示：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-R" data-lang="R"><span class="line"><span class="cl"><span class="n">correlation.matrix</span> <span class="o">&lt;-</span> <span class="nf">cor</span><span class="p">(</span><span class="n">attitude[</span><span class="p">,</span><span class="nf">c</span><span class="p">(</span><span class="s">&#34;rating&#34;</span><span class="p">,</span> <span class="s">&#34;complaints&#34;</span><span class="p">,</span> <span class="s">&#34;privileges&#34;</span><span class="p">)</span><span class="n">]</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nf">stargazer</span><span class="p">(</span><span class="n">correlation.matrix</span><span class="p">,</span> <span class="n">title</span> <span class="o">=</span> <span class="s">&#34;Correlation Matrix&#34;</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><img
        class="lazyload"
        data-src="https://static.datartisan.com/upload/attachment/2016/12/cC2cR66K.png"
        data-srcset="https://static.datartisan.com/upload/attachment/2016/12/cC2cR66K.png, https://static.datartisan.com/upload/attachment/2016/12/cC2cR66K.png 1.5x, https://static.datartisan.com/upload/attachment/2016/12/cC2cR66K.png 2x"
        data-sizes="auto"
        alt="https://static.datartisan.com/upload/attachment/2016/12/cC2cR66K.png"
        title="矩阵展示"
    /></p>
<hr>
<h2 id="统计模型结果">统计模型结果</h2>
<h3 id="回归表">回归表</h3>
<p>在 R 中可以很方便的使用 <code>lm()</code> 和 <code>glm()</code> 函数来构建回归模型，我们同样可以在同一张表中对这些模型进行比较，参数 <code>title</code> 用来设定表的标题，参数 <code>align</code> 使每列中的系数沿小数点对齐：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-R" data-lang="R"><span class="line"><span class="cl"><span class="c1">## 构建两个线性回归模型</span>
</span></span><span class="line"><span class="cl"><span class="n">linear.1</span> <span class="o">&lt;-</span> <span class="nf">lm</span><span class="p">(</span><span class="n">rating</span> <span class="o">~</span> <span class="n">complaints</span> <span class="o">+</span> <span class="n">privileges</span> <span class="o">+</span> <span class="n">learning</span> <span class="o">+</span> <span class="n">raises</span> <span class="o">+</span> <span class="n">critical</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="n">data</span> <span class="o">=</span> <span class="n">attitude</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">linear.2</span> <span class="o">&lt;-</span> <span class="nf">lm</span><span class="p">(</span><span class="n">rating</span> <span class="o">~</span> <span class="n">complaints</span> <span class="o">+</span> <span class="n">privileges</span> <span class="o">+</span> <span class="n">learning</span><span class="p">,</span> <span class="n">data</span> <span class="o">=</span> <span class="n">attitude</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">## 构建一个 probit 模型</span>
</span></span><span class="line"><span class="cl"><span class="n">attitude</span><span class="o">$</span><span class="n">high.rating</span> <span class="o">&lt;-</span> <span class="p">(</span><span class="n">attitude</span><span class="o">$</span><span class="n">rating</span> <span class="o">&gt;</span> <span class="m">70</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">probit.model</span> <span class="o">&lt;-</span> <span class="nf">glm</span><span class="p">(</span><span class="n">high.rating</span> <span class="o">~</span> <span class="n">learning</span> <span class="o">+</span> <span class="n">critical</span> <span class="o">+</span> <span class="n">advance</span><span class="p">,</span> <span class="n">data</span> <span class="o">=</span> <span class="n">attitude</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="n">family</span> <span class="o">=</span> <span class="nf">binomial</span><span class="p">(</span><span class="n">link</span> <span class="o">=</span> <span class="s">&#34;probit&#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">stargazer</span><span class="p">(</span><span class="n">linear.1</span><span class="p">,</span> <span class="n">linear.2</span><span class="p">,</span> <span class="n">probit.model</span><span class="p">,</span> <span class="n">title</span> <span class="o">=</span> <span class="s">&#34;Results&#34;</span><span class="p">,</span> <span class="n">align</span> <span class="o">=</span> <span class="kc">TRUE</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><img
        class="lazyload"
        data-src="https://static.datartisan.com/upload/attachment/2016/12/Cyqs7adZ.png"
        data-srcset="https://static.datartisan.com/upload/attachment/2016/12/Cyqs7adZ.png, https://static.datartisan.com/upload/attachment/2016/12/Cyqs7adZ.png 1.5x, https://static.datartisan.com/upload/attachment/2016/12/Cyqs7adZ.png 2x"
        data-sizes="auto"
        alt="https://static.datartisan.com/upload/attachment/2016/12/Cyqs7adZ.png"
        title="回归表"
    /></p>
<h4 id="回归表的修饰">回归表的修饰</h4>
<p>为了使表格更加标准，我们还可以通过调整参数进行以下操作：</p>
<ul>
<li>删除表中的空白行：<code>no.space</code></li>
<li>移除不关心的统计量：<code>omit.stat</code></li>
<li>修改因变量和自变量的名称：<code>dep.var.labels</code> 、 <code>covariate.labels</code></li>
</ul>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-R" data-lang="R"><span class="line"><span class="cl"><span class="nf">stargazer</span><span class="p">(</span><span class="n">linear.1</span><span class="p">,</span> <span class="n">linear.2</span><span class="p">,</span> <span class="n">probit.model</span><span class="p">,</span> <span class="n">title</span> <span class="o">=</span> <span class="s">&#34;Regression Results&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="n">align</span> <span class="o">=</span> <span class="kc">TRUE</span><span class="p">,</span> <span class="n">dep.var.labels</span> <span class="o">=</span> <span class="nf">c</span><span class="p">(</span><span class="s">&#34;Overall Rating&#34;</span><span class="p">,</span><span class="s">&#34;High Rating&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"><span class="n">covariate.labels</span> <span class="o">=</span> <span class="nf">c</span><span class="p">(</span><span class="s">&#34;Handling of Complaints&#34;</span><span class="p">,</span> <span class="s">&#34;No Special Privileges&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="s">&#34;Opportunity to Learn&#34;</span><span class="p">,</span> <span class="s">&#34;Performance-Based Raises&#34;</span><span class="p">,</span> <span class="s">&#34;Too Critical&#34;</span><span class="p">,</span><span class="s">&#34;Advancement&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"><span class="n">omit.stat</span> <span class="o">=</span> <span class="nf">c</span><span class="p">(</span><span class="s">&#34;LL&#34;</span><span class="p">,</span> <span class="s">&#34;ser&#34;</span><span class="p">,</span> <span class="s">&#34;f&#34;</span><span class="p">),</span> <span class="n">no.space</span> <span class="o">=</span> <span class="kc">TRUE</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><img
        class="lazyload"
        data-src="https://static.datartisan.com/upload/attachment/2016/12/xHMLhXyR.png"
        data-srcset="https://static.datartisan.com/upload/attachment/2016/12/xHMLhXyR.png, https://static.datartisan.com/upload/attachment/2016/12/xHMLhXyR.png 1.5x, https://static.datartisan.com/upload/attachment/2016/12/xHMLhXyR.png 2x"
        data-sizes="auto"
        alt="https://static.datartisan.com/upload/attachment/2016/12/xHMLhXyR.png"
        title="回归表的修饰"
    /></p>
<p>本例中对原表格做了以下修改：</p>
<blockquote>
<ol>
<li>
<p>使用 <code>dep.var.labels</code> 和 <code>covariate.lables</code> 参数分别将因变量和自变量重命名为容易理解的形式；</p>
</li>
<li>
<p>使用 <code>omit.stat</code> 参数移除对数似然比（<code>&quot;LL&quot;</code>）、标准化残差（<code>&quot;ser&quot;</code>）和 F 统计量（<code>&quot;f&quot;</code>）；</p>
</li>
<li>
<p>使用<code>no.space</code>参数将输出表格中的空行删去。</p>
</li>
</ol>
</blockquote>
<h4 id="展示置信区间">展示置信区间</h4>
<ul>
<li>设置是否展示置信区间：<code>ci</code></li>
<li>设置置信区间的置信度：<code>ci.level</code></li>
<li>使回归系数与置信区间并排展示：<code>single.row</code></li>
</ul>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-R" data-lang="R"><span class="line"><span class="cl"><span class="nf">stargazer</span><span class="p">(</span><span class="n">linear.1</span><span class="p">,</span> <span class="n">linear.2</span><span class="p">,</span> <span class="n">title</span> <span class="o">=</span> <span class="s">&#34;Regression Results&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="n">dep.var.labels</span> <span class="o">=</span> <span class="nf">c</span><span class="p">(</span><span class="s">&#34;Overall Rating&#34;</span><span class="p">,</span> <span class="s">&#34;High Rating&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"><span class="n">covariate.labels</span> <span class="o">=</span> <span class="nf">c</span><span class="p">(</span><span class="s">&#34;Handling of Complaints&#34;</span><span class="p">,</span> <span class="s">&#34;No Special Privileges&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="s">&#34;Opportunity to Learn&#34;</span><span class="p">,</span> <span class="s">&#34;Performance-Based Raises&#34;</span><span class="p">,</span> <span class="s">&#34;Too Critical&#34;</span><span class="p">,</span> <span class="s">&#34;Advancement&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"><span class="n">omit.stat</span> <span class="o">=</span> <span class="nf">c</span><span class="p">(</span><span class="s">&#34;LL&#34;</span><span class="p">,</span><span class="s">&#34;ser&#34;</span><span class="p">,</span><span class="s">&#34;f&#34;</span><span class="p">),</span> <span class="n">ci</span> <span class="o">=</span> <span class="kc">TRUE</span><span class="p">,</span> <span class="n">ci.level</span> <span class="o">=</span> <span class="m">0.90</span><span class="p">,</span> <span class="n">single.row</span> <span class="o">=</span> <span class="kc">TRUE</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><img
        class="lazyload"
        data-src="https://static.datartisan.com/upload/attachment/2016/12/rUe11IM4.png"
        data-srcset="https://static.datartisan.com/upload/attachment/2016/12/rUe11IM4.png, https://static.datartisan.com/upload/attachment/2016/12/rUe11IM4.png 1.5x, https://static.datartisan.com/upload/attachment/2016/12/rUe11IM4.png 2x"
        data-sizes="auto"
        alt="https://static.datartisan.com/upload/attachment/2016/12/rUe11IM4.png"
        title="展示置信区间"
    /></p>
<h4 id="其他修饰功能">其他修饰功能</h4>
<blockquote>
<p>控制自变量展示的顺序：<code>order</code>
控制要展示的统计量：<code>keep.stat</code> , <code>keep.stat = &quot;n&quot;</code> 即只展示样本量的大小，并移除其他统计量</p>
</blockquote>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-R" data-lang="R"><span class="line"><span class="cl"><span class="nf">stargazer</span><span class="p">(</span><span class="n">linear.1</span><span class="p">,</span> <span class="n">linear.2</span><span class="p">,</span> <span class="n">title</span> <span class="o">=</span> <span class="s">&#34;Regression Results&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="n">dep.var.labels</span> <span class="o">=</span> <span class="nf">c</span><span class="p">(</span><span class="s">&#34;Overall Rating&#34;</span><span class="p">,</span> <span class="s">&#34;High Rating&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"><span class="n">order</span> <span class="o">=</span> <span class="nf">c</span><span class="p">(</span><span class="s">&#34;learning&#34;</span><span class="p">,</span> <span class="s">&#34;privileges&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"><span class="n">keep.stat</span> <span class="o">=</span> <span class="s">&#34;n&#34;</span><span class="p">,</span> <span class="n">ci</span> <span class="o">=</span> <span class="kc">TRUE</span><span class="p">,</span> <span class="n">ci.level</span> <span class="o">=</span> <span class="m">0.90</span><span class="p">,</span> <span class="n">single.row</span> <span class="o">=</span> <span class="kc">TRUE</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><img
        class="lazyload"
        data-src="https://static.datartisan.com/upload/attachment/2016/12/u0K7suc0.png"
        data-srcset="https://static.datartisan.com/upload/attachment/2016/12/u0K7suc0.png, https://static.datartisan.com/upload/attachment/2016/12/u0K7suc0.png 1.5x, https://static.datartisan.com/upload/attachment/2016/12/u0K7suc0.png 2x"
        data-sizes="auto"
        alt="https://static.datartisan.com/upload/attachment/2016/12/u0K7suc0.png"
        title="其他修饰功能"
    /></p>
<h4 id="控制输出格式">控制输出格式</h4>
<p>可以使用 <code>type</code> 参数控制以 <code>ASCII</code> 、<code>text</code>、<code>html</code>、<code>latex</code> 格式输出，默认为<code>LATEX</code> 格式。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-R" data-lang="R"><span class="line"><span class="cl"><span class="nf">stargazer</span><span class="p">(</span><span class="n">linear.1</span><span class="p">,</span> <span class="n">linear.2</span><span class="p">,</span> <span class="n">type</span> <span class="o">=</span> <span class="s">&#34;text&#34;</span><span class="p">,</span> <span class="n">title</span> <span class="o">=</span> <span class="s">&#34;Regression Results&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="n">dep.var.labels</span> <span class="o">=</span> <span class="nf">c</span><span class="p">(</span><span class="s">&#34;Overall Rating&#34;</span><span class="p">,</span> <span class="s">&#34;High Rating&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"><span class="n">order</span> <span class="o">=</span> <span class="nf">c</span><span class="p">(</span><span class="s">&#34;learning&#34;</span><span class="p">,</span> <span class="s">&#34;privileges&#34;</span><span class="p">),</span> 
</span></span><span class="line"><span class="cl"><span class="n">keep.stat</span> <span class="o">=</span> <span class="s">&#34;n&#34;</span><span class="p">,</span> <span class="n">ci</span> <span class="o">=</span> <span class="kc">TRUE</span><span class="p">,</span> <span class="n">ci.level</span> <span class="o">=</span> <span class="m">0.90</span><span class="p">,</span> <span class="n">single.row</span> <span class="o">=</span> <span class="kc">TRUE</span><span class="p">,</span> <span class="n">header</span> <span class="o">=</span> <span class="bp">F</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><img
        class="lazyload"
        data-src="https://static.datartisan.com/upload/attachment/2016/12/gOA9wyCN.png"
        data-srcset="https://static.datartisan.com/upload/attachment/2016/12/gOA9wyCN.png, https://static.datartisan.com/upload/attachment/2016/12/gOA9wyCN.png 1.5x, https://static.datartisan.com/upload/attachment/2016/12/gOA9wyCN.png 2x"
        data-sizes="auto"
        alt="https://static.datartisan.com/upload/attachment/2016/12/gOA9wyCN.png"
        title="控制输出格式"
    /></p>
<h4 id="自定义统计量">自定义统计量</h4>
<p>我们使用 <code>sandwich</code> 包来计算异方差-稳健标准误，并将其与默认计算的标准差一同展示。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-R" data-lang="R"><span class="line"><span class="cl"><span class="nf">library</span><span class="p">(</span><span class="n">sandwich</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">cov</span> <span class="o">&lt;-</span> <span class="nf">vcovHC</span><span class="p">(</span><span class="n">linear.1</span><span class="p">,</span> <span class="n">type</span> <span class="o">=</span> <span class="s">&#34;HC&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">robust.se</span> <span class="o">&lt;-</span> <span class="nf">sqrt</span><span class="p">(</span><span class="nf">diag</span><span class="p">(</span><span class="n">cov</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">stargazer</span><span class="p">(</span><span class="n">linear.1</span><span class="p">,</span> <span class="n">linear.1</span><span class="p">,</span> <span class="n">se</span> <span class="o">=</span> <span class="nf">list</span><span class="p">(</span><span class="kc">NULL</span><span class="p">,</span> <span class="n">robust.se</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"><span class="n">column.labels</span> <span class="o">=</span> <span class="nf">c</span><span class="p">(</span><span class="s">&#34;default&#34;</span><span class="p">,</span> <span class="s">&#34;robust&#34;</span><span class="p">))</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><img
        class="lazyload"
        data-src="https://static.datartisan.com/upload/attachment/2016/12/PC8L8NoB.png"
        data-srcset="https://static.datartisan.com/upload/attachment/2016/12/PC8L8NoB.png, https://static.datartisan.com/upload/attachment/2016/12/PC8L8NoB.png 1.5x, https://static.datartisan.com/upload/attachment/2016/12/PC8L8NoB.png 2x"
        data-sizes="auto"
        alt="https://static.datartisan.com/upload/attachment/2016/12/PC8L8NoB.png"
        title="自定义统计量"
    /></p>
<h3 id="支持的模型">支持的模型</h3>
<p>目前 <code>stargazer</code> 支持以下模型结果的展示：</p>
<blockquote>
<p>aftreg (eha), arima (stats), betareg (betareg), binaryChoice (sampleSelection), bj (rms), brglm (brglm), censReg (censReg), coeftest (lmtest), coxph (survival), coxreg (eha), clm (ordinal), clogit (survival), cph (rms), dynlm (dynlm), ergm(ergm), errorsarlm (spdev), felm (lfe), gam (mgcv), garchFit (fGarch), gee (gee), glm (stats), Glm (rms), glmer (lme4), glmrob(robustbase), gls (nlme), Gls (rms), gmm (gmm), heckit (sampleSelection), hetglm (glmx), hurdle (pscl), ivreg (AER), lagarlm (spdep), lm(stats), lme (nlme), lmer (lme4), lmrob (robustbase), lrm (rms), maBina (erer), mclogit (mclogit), mlogit (mlogit), mnlogit (mnlogit), mlreg (eha), multinom (nnet), nlme (nlme), nlmer (lme4), ols (rms), pgmm(plm), phreg (eha), plm (plm), pmg (plm), polr (MASS), psm (rms), rem.dyad (relevent), rlm(MASS), rq (quantreg), Rq (rms), selection (sampleSelection), svyglm (survey), survreg (survival), tobit (AER), weibreg (eha), zeroinfl (pscl), as well as from the implementation of these in zelig. In addition, stargazer also supports the following zelig models: “relogit”, “cloglog.net”, “gamma.net”, “probit.net” and “logit.net”.</p>
</blockquote>
<h3 id="支持的模板">支持的模板</h3>
<p><code>style</code> 参数可以用来选择统计表的展现形式，你可以通过  <code>?stargazer</code> 查看具体参数的设置来获取具体支持的格式，目前支持的期刊统计图格式有 <code>American Economic Review</code>、 <code>Quarterly Journal of Economics</code>  等。</p>
<h2 id="结合-rmarkdown-使用">结合 rmarkdown 使用</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="n">```{r, results=&#39;asis&#39;}
</span></span></span><span class="line"><span class="cl"><span class="n">stargazer(model, header = F)
</span></span></span><span class="line"><span class="cl"><span class="n">```</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p><strong>注意事项：</strong></p>
<ul>
<li>要加上 <code>results='asis'</code> 保证输出的是表格，而不是 LATEX 文本；</li>
<li>参数 <code>align</code> 失效，不能使用；</li>
<li>加上参数 <code>header=FALSE</code>，避免输出关于包作者的一些文本信息。</li>
</ul>
</blockquote>
<h2 id="致谢">致谢</h2>
<blockquote>
<h3 id="参考文章">参考文章</h3>
<ul>
<li><a href="https://cran.r-project.org/web/packages/stargazer/vignettes/stargazer.pdf" target="_blank" rel="noopener noreffer">stargazer.pdf</a></li>
<li>Hlavac, Marek (2018). stargazer: Well-Formatted Regression and Summary Statistics
Tables. R package version 5.2.2. <a href="https://CRAN.R-project.org/package=stargazer" target="_blank" rel="noopener noreffer">https://CRAN.R-project.org/package=stargazer</a></li>
</ul>
</blockquote>]]></content:encoded></item><item><title>R Markdown: 数据报告生成利器</title><link>https://philohao.com/2018/07/20180709/</link><pubDate>Mon, 09 Jul 2018 22:44:09 +0800</pubDate><dc:creator>Jianfeng.Hao</dc:creator><author>haojianfeng1997@gmail.com (Jianfeng.Hao)</author><guid isPermaLink="true">https://philohao.com/2018/07/20180709/</guid><description>R Markdown 使用笔记，介绍通过 knitr 与 Pandoc 生成数据报告的基础流程。</description><content:encoded><![CDATA[<center>
    <i>   
        R Markdown 站在 knitr 和 Pandoc 的肩膀上，前者执行嵌入于文档中的计算机代码，并将 R Markdown 转换为 Markdown；后者将 Markdown 呈现出您想要的输出格式（如 PDF、HTML、Word 等）
    </i>
</center>
<p>此篇文章翻译自谢益辉新书 <a href="https://bookdown.org/yihui/rmarkdown/" target="_blank" rel="noopener noreffer">《R Markdown: The Definitive Guide》</a> 的前三章节，内容有所删减，主要介绍了 R Markdown 的相关结构及语法规则，如果想了解更多更详细的内容推荐您阅读原书。</p>
<h1 id="安装">安装</h1>
<p>这里假设您已经安装了 R (<a href="https://www.r-project.org/" target="_blank" rel="noopener noreffer">https://www.r-project.org</a>)  和 RStudio IDE (<a href="https://www.rstudio.com/" target="_blank" rel="noopener noreffer">https://www.rstudio.com</a>) 。Rstudio 并不是必须的，但安装它会使您更加容易地使用 R Markdown。如果您没有安装 RStudio IDE，您将不得不安装 Pandoc（ <a href="https://pandoc.org" target="_blank" rel="noopener noreffer">https://pandoc.org</a> ），否则就不需要单独安装 Pandoc，因为在安装 RStudio 时已经将它捆绑安装了。接下来，您可以在 R 中安装 <code>rmarkdown</code> 包：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-R" data-lang="R"><span class="line"><span class="cl"><span class="c1"># Install from CRAN</span>
</span></span><span class="line"><span class="cl"><span class="nf">install.packages</span><span class="p">(</span><span class="s">&#39;rmarkdown&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Or if you want to test the development version,</span>
</span></span><span class="line"><span class="cl"><span class="c1"># install from GitHub</span>
</span></span><span class="line"><span class="cl"><span class="kr">if</span> <span class="p">(</span><span class="o">!</span><span class="nf">requireNamespace</span><span class="p">(</span><span class="s">&#34;devtools&#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">  <span class="nf">install.packages</span><span class="p">(</span><span class="s">&#39;devtools&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">devtools</span><span class="o">::</span><span class="nf">install_github</span><span class="p">(</span><span class="s">&#39;rstudio/rmarkdown&#39;</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>如果您想要生成 PDF 类型文档输出，您将需要安装 LaTeX 。对于那些以前没有安装过 LaTeX 的 R Markdown 用户，我们建议您安装 TinyTeX（https://yihui./tinytex/）：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-R" data-lang="R"><span class="line"><span class="cl"><span class="nf">install.packages</span><span class="p">(</span><span class="s">&#34;tinytex&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">tinytex</span><span class="o">::</span><span class="nf">install_tinytex</span><span class="p">()</span>  <span class="c1"># install TinyTeX</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>TinyTeX 相当于一款轻量级、跨平台、易于维护的 LaTeX 。在将 LaTeX  或 R Markdown 文档编译成 PDF 时，<code>tinytex</code> 可以帮助您自动安装所需的相关 R 包，同时还能确保一个 LaTeX  文档被编译成正确的次数，以解决所有的交叉引用问题。如果您不明白这两件事是什么意思，应该按照我们的建议来安装 TinyTeX，因为这些细节往往并不值得您花费时间和精力去关心。</p>
<p>使用 <code>rmarkdown</code> 包、RStudio/Pandoc 和 LaTeX，您应该能够编译大多数R Markdown 文档。在某些情况下，您可能需要其他软件包，我们将在必要时提到它们。</p>
<blockquote>
<p><strong>参考文献</strong></p>
<ul>
<li>R Core Team. 2018. <em>R: A Language and Environment for Statistical Computing</em>. Vienna, Austria: R Foundation for Statistical Computing. <a href="https://www.r-project.org/" target="_blank" rel="noopener noreffer">https://www.R-project.org/</a>.</li>
<li>Xie, Yihui. 2018f. <em>Tinytex: Helper Functions to Install and Maintain Tex Live, and Compile Latex Documents</em>. <a href="https://github.com/yihui/tinytex" target="_blank" rel="noopener noreffer">https://github.com/yihui/tinytex</a>.</li>
</ul>
</blockquote>
<hr>
<h1 id="基础知识">基础知识</h1>
<p>R Markdown 为数据科学提供了一个创作框架。R Markdown 能胜任以下两个任务：</p>
<ul>
<li>保存并执行代码；</li>
<li>生成可共享的高质量报告。</li>
</ul>
<p>R Markdown 的设计初衷是为了更容易地实现报告内容的可重复性，这是因为计算代码和叙述都在同一个文档中，结果是由源代码自动生成的。并且 R Markdown 支持数十种静态和动态/交互式输出格式。</p>
<p>如果您更喜欢观看视频进行学习，我们建议您查看网站 <a href="https://rmarkdown.rstudio.com" target="_blank" rel="noopener noreffer">https://rmarkdown.rstudio.com</a>，并在 “Get Started ” 中观看视频，其中包括了 R Markdown 的基础知识。</p>
<h2 id="文档结构">文档结构</h2>
<p>下面是一份非常简易的 R Markdown 文档，是一个带有 <code>.Rmd</code> 拓展名的纯文本文档。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Hello R Markdown&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">author</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Awesome Me&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">date</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;2018-02-14&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">output</span><span class="p">:</span><span class="w"> </span><span class="l">html_document</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nn">---</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">This is a paragraph in an R Markdown document.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Below is a code chunk:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">```{r}
</span></span><span class="line"><span class="cl">fit = lm(dist ~ speed, data = cars)
</span></span><span class="line"><span class="cl">b   = coef(fit)
</span></span><span class="line"><span class="cl">plot(cars)
</span></span><span class="line"><span class="cl">abline(fit)
</span></span><span class="line"><span class="cl"><span class="s">```
</span></span></span><span class="line"><span class="cl"><span class="s"></span>
</span></span><span class="line"><span class="cl">The slope of the regression is `r b[1]`.
</span></span><span class="line"><span class="cl"><span class="s">```</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>您可以使用任何文本编辑器（包括但不限于 RStudio）来创建这样的文本文档。如果使用 RStudio，您可以从 <code>File -&gt; New File -&gt; R Markdown </code> 中创建一个新的 Rmd 文档。</p>
<p>一份 R Markdown 文档有三个基础组成部分：元数据，文本和代码。元数据是在三个连接符 <code>---</code> 之间的内容。元数据的语法是 YAML（ <a href="https://en.wikipedia.org/wiki/YAML" target="_blank" rel="noopener noreffer">YAML 不是标记语言</a> ），所以有时它也被称为 YAML metadata 或 YAML frontmatter。 需要注意的是，缩进在 YAML 中十分重要，忽视它会让你付出惨重代价。请参阅谢益辉所写的 《bookdown》（2016）一书中的 <a href="https://bookdown.org/yihui/bookdown/r-markdown.html" target="_blank" rel="noopener noreffer">附录b.2</a> 来了解一些简单的例子，这些示例展示了 YAML 语法。</p>
<p>文档的主体遵循元数据书写的规则。文本的语法是 Markdown，将在第 2.5 节中进行介绍。有两种类型的计算机代码，在第 2.6 节中进行了详细解释：</p>
<ul>
<li><strong>代码块</strong>：以三个重音符及所使用语言开始，其中 <code>r</code> 代表所使用的程序语言，并以三个重音符结束。 可以在花括号中填写块选项（如：将图形高度设置为5英寸：<code>{r, fig.height=5}</code>）。</li>
<li><strong>内联代码</strong>：以 ``r` 开始，并以单个重音符结束。</li>
</ul>
<h2 id="文档编译">文档编译</h2>
<p>最简单的方式莫过于在 RStudio 中单击 <code>Knit</code> 按钮，对应的快捷键为 <code>Ctrl + Shift + K</code> （在 macOS 中为 <code>Cmd + Shift + K</code>）。当然也可以直接运行代码 <code>rmarkdown::render</code> 来进行渲染编译，如：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-R" data-lang="R"><span class="line"><span class="cl"><span class="n">rmarkdown</span><span class="o">::</span><span class="nf">render</span><span class="p">(</span><span class="s">&#39;foo.Rmd&#39;</span><span class="p">,</span> <span class="s">&#39;pdf_document&#39;</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>当编译多个文档时，使用函数更加方便，因为可以直接使用循环来进行渲染编译。</p>
<h2 id="参考卡片">参考卡片</h2>
<p>RStudio 已经创建了大量的参考卡片，它们可以在 <a href="https://www.rstudio.com/resources/cheatsheets/" target="_blank" rel="noopener noreffer">https://www.rstudio.com/resources/cheatsheets/</a> 上免费获得。</p>
<h2 id="输出格式">输出格式</h2>
<p>有两种输出格式：documents 和 presentations 。所有可用的格式如下所示 ：</p>
<ul>
<li><code>beamer_presentation</code></li>
<li><code>github_document</code></li>
<li><code>html_document</code></li>
<li><code>ioslides_presentation</code></li>
<li><code>latex_document</code></li>
<li><code>md_document</code></li>
<li><code>odt_document</code></li>
<li><code>pdf_document</code></li>
<li><code>powerpoint_presentation</code></li>
<li><code>rtf_document</code></li>
<li><code>slidy_presentation</code></li>
<li><code>word_document</code></li>
</ul>
<p>我们将在第 3 章和第 4 章详细地记录这些输出格式。在其他扩展包中提供了更多的输出格式（从第 5 章开始）。对于 Rmd 文件的 YAML 元数据中的输出格式名称，如果格式来自扩展包，您需要包含包名（若格式来自于 <code>rmarkdown</code> 包，则不需要 <code>rmarkdown::</code>前缀 ），例如：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> </span><span class="l">tufte::tufte_html</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>每种输出格式通常都有多种格式选项。所有这些选项都记录在 R 包 help 页面上。例如，您可以在 R 中键入 <code>?rmarkdown::</code> 打开关于 <code>html_document</code> 格式的 help 页面。当您想要使用某些选项时，必须将这些值从 R 转换成 YAML，例如：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-R" data-lang="R"><span class="line"><span class="cl"><span class="nf">html_document</span><span class="p">(</span><span class="n">toc</span> <span class="o">=</span> <span class="kc">TRUE</span><span class="p">,</span> <span class="n">toc_depth</span> <span class="o">=</span> <span class="m">2</span><span class="p">,</span> <span class="n">dev</span> <span class="o">=</span> <span class="s">&#39;svg&#39;</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>可以用 YAML 写为：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">html_document</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">toc</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">toc_depth</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">dev</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;svg&#39;</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>YAML 中的字符串通常不需要引号（``dev：“svg”<code>和</code>dev:svg<code>是相同的），除非它们包含特殊字符，比如冒号</code>：<code>。如果您不确定是否应该引用字符串，那么用 </code>yaml` 包来测试它，例如：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-R" data-lang="R"><span class="line"><span class="cl"><span class="nf">cat</span><span class="p">(</span><span class="n">yaml</span><span class="o">::</span><span class="nf">as.yaml</span><span class="p">(</span><span class="nf">list</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">  <span class="n">title</span> <span class="o">=</span> <span class="s">&#39;A Wonderful Day&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">subtitle</span> <span class="o">=</span> <span class="s">&#39;hygge: a quality of coziness&#39;</span>
</span></span><span class="line"><span class="cl"><span class="p">)))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## title: A Wonderful Day</span>
</span></span><span class="line"><span class="cl"><span class="c1">## subtitle: &#39;hygge: a quality of coziness&#39;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>注意，上面例子中的副标题是由于冒号而引用单引号的。</p>
<p>如果某一选项有子选项（这意味着该选项的值是 R 中的列表），则子选项需要进一步缩进，例如：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">html_document</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">toc</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">includes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">in_header</span><span class="p">:</span><span class="w"> </span><span class="l">header.html</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">before_body</span><span class="p">:</span><span class="w"> </span><span class="l">before.html</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>一些选项将被传递给 <strong>knitr</strong> ，比如 <code>dev</code>、<code>fig_width</code> 和 <code>fig_height</code>。这些选项的详细文档可以在 <a href="https://yihui.name/knitr/options/" target="_blank" rel="noopener noreffer">knitr 文档页面</a> 上找到。请注意，实际的 knitr 选项名称可能有所不同。特别是，knitr 在名称中使用 <code>.</code>，但 rmarkdown 使用 <code>_</code>，例如，在 rmarkdown 中，<code>fig_width</code>  对应于knitr 中的 <code>fig.width</code> 。</p>
<p>一些选项将被传递给 <strong>Pandoc</strong>，比如 <code>toc</code>、<code>toc_depth</code> 和 <code>number_sections</code> 。当有疑问时，您应该参考 Pandoc 文档。R Markdown 输出格式函数通常有一个<code>pandoc_args</code>  参数，它应该是传递给 Pandoc 的参数的字符向量。如果您发现任何没有由输出格式参数表示的 Pandoc 特性，您可以使用这个终极论证，例如：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">pdf_document</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">toc</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">pandoc_args</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;--wrap=none&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;--top-level-division=chapter&#34;</span><span class="p">]</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><h2 id="markdown-语法">Markdown 语法</h2>
<h3 id="内联格式">内联格式</h3>
<ul>
<li>
<p><em>斜体</em> ：<code>_text_</code> 或 <code>*text*</code></p>
</li>
<li>
<p><strong>粗体</strong> ：<code>**text** </code></p>
</li>
<li>
<p>下标 ：<code>H~3~PO~4~</code>  渲染为 $H_3PO_4$</p>
</li>
<li>
<p>上标 ：<code>Cu^2+^</code>  渲染为 $Cu^{2+}$</p>
</li>
<li>
<p>脚注 ： <code>^[This is a footnote.]</code></p>
</li>
<li>
<p>内联代码 ：<code>`code`</code> , 可以使用 n+1 个重音符输出包含 n 个重音符的代码块。</p>
</li>
<li>
<p>超链接 ：<code>[text](link) </code></p>
</li>
<li>
<p>图片链接 ： <code>![alt text or image title](path/to/image)</code></p>
</li>
<li>
<p>引用 ：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="vi">@Manual</span><span class="p">{</span><span class="n">R</span><span class="o">-</span><span class="n">base</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">title</span> <span class="o">=</span> <span class="p">{</span><span class="ss">R</span><span class="p">:</span> <span class="n">A</span> <span class="no">Language</span> <span class="ow">and</span> <span class="no">Environment</span> <span class="k">for</span> <span class="no">Statistical</span>
</span></span><span class="line"><span class="cl">    <span class="no">Computing</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="n">author</span> <span class="o">=</span> <span class="p">{{</span><span class="n">R</span> <span class="no">Core</span> <span class="no">Team</span><span class="p">}},</span>
</span></span><span class="line"><span class="cl">  <span class="n">organization</span> <span class="o">=</span> <span class="p">{</span><span class="n">R</span> <span class="no">Foundation</span> <span class="k">for</span> <span class="no">Statistical</span> <span class="no">Computing</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="n">address</span> <span class="o">=</span> <span class="p">{</span><span class="no">Vienna</span><span class="p">,</span> <span class="no">Austria</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="n">year</span> <span class="o">=</span> <span class="p">{</span><span class="mi">2017</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="n">url</span> <span class="o">=</span> <span class="p">{</span><span class="ss">https</span><span class="p">:</span><span class="sr">//</span><span class="n">www</span><span class="o">.</span><span class="n">R</span><span class="o">-</span><span class="n">project</span><span class="o">.</span><span class="n">org</span><span class="o">/</span><span class="p">},</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
</ul>
<h3 id="块级元素">块级元素</h3>
<ul>
<li>
<p><strong>标题</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-Markdown" data-lang="Markdown"><span class="line"><span class="cl"><span class="gh"># First-level header
</span></span></span><span class="line"><span class="cl"><span class="gh"></span>
</span></span><span class="line"><span class="cl"><span class="gu">## Second-level header
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>
</span></span><span class="line"><span class="cl"><span class="gu">### Third-level header
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>如果不想让某个标题被编号，可以在标题后面添加 <code>{-}</code> 或者 <code>{.unnumbered}</code>，如：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-Markdown" data-lang="Markdown"><span class="line"><span class="cl"><span class="gh"># Preface {-} 
</span></span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><strong>无序列表</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-Markdown" data-lang="Markdown"><span class="line"><span class="cl"><span class="k">-</span> one item
</span></span><span class="line"><span class="cl"><span class="k">-</span> one item
</span></span><span class="line"><span class="cl"><span class="k">-</span> one item
</span></span><span class="line"><span class="cl">  <span class="k">-</span> one more item
</span></span><span class="line"><span class="cl">  <span class="k">-</span> one more item
</span></span><span class="line"><span class="cl">  <span class="k">-</span> one more item
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><strong>有序列表</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-Markdown" data-lang="Markdown"><span class="line"><span class="cl"><span class="k">1.</span> the first item
</span></span><span class="line"><span class="cl"><span class="k">2.</span> the second item
</span></span><span class="line"><span class="cl"><span class="k">3.</span> the third item
</span></span><span class="line"><span class="cl">  <span class="k">-</span> one unordered item
</span></span><span class="line"><span class="cl">  <span class="k">-</span> one unordered item
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><strong>引用</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-Markdown" data-lang="Markdown"><span class="line"><span class="cl"><span class="k">&gt; </span><span class="ge">&#34;I thoroughly disapprove of duels. If a man should challenge me,
</span></span></span><span class="line"><span class="cl"><span class="ge"></span>  I would take him kindly and forgivingly by the hand and lead him
</span></span><span class="line"><span class="cl">  to a quiet place and kill him.&#34;
</span></span><span class="line"><span class="cl"><span class="k">&gt;
</span></span></span><span class="line"><span class="cl"><span class="k"></span><span class="ge">&gt;                                                 --- Mark Twain
</span></span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>&ldquo;I thoroughly disapprove of duels. If a man should challenge me,
I would take him kindly and forgivingly by the hand and lead him
to a quiet place and kill him.&rdquo;</p>
<p>​                                               &mdash; Mark Twain</p>
</blockquote>
</li>
<li>
<p><strong>代码块</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-Markdown" data-lang="Markdown"><span class="line"><span class="cl"><span class="s">```
</span></span></span><span class="line"><span class="cl"><span class="s"></span>This text is displayed verbatim / preformatted
</span></span><span class="line"><span class="cl"><span class="s">```</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Or indent by four spaces:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    This text is displayed verbatim / preformatted
</span></span></code></pre></td></tr></table>
</div>
</div></li>
</ul>
<h3 id="数学表达式">数学表达式</h3>
<p><code>$f(k) = {n \choose k} p^{k} (1-p)^{n-k}$ </code> :  $f(k) = {n \choose k} p^{k} (1-p)^{n-k}$</p>
<p><code>$$f(k) = {n \choose k} p^{k} (1-p)^{n-k}$$ </code> :</p>
<p>$$
f(k) = {n \choose k} p^{k} (1-p)^{n-k}
$$</p>
<hr>
<h2 id="代码块选项">代码块选项</h2>
<p>单击 <code>Insert</code> 按钮，对应快捷键为 <code>Ctrl + Alt + I</code> （macOS：<code>Cmd + Option + I</code> ）。</p>
<p>在 <a href="https://yihui.name/knitr/options" target="_blank" rel="noopener noreffer">https://yihui.name/knitr/options</a> 中有大量的代码块可选项，在此我们列出常用的一部分：</p>
<ul>
<li>
<p><code>eval=TRUE</code> ：执行当前代码块；</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-R" data-lang="R"><span class="line"><span class="cl"><span class="n">```{r}
</span></span></span><span class="line"><span class="cl"><span class="n"># execute code if the date is later than a specified day
</span></span></span><span class="line"><span class="cl"><span class="n">do_it = Sys.Date() &gt; &#39;2018-02-14&#39;
</span></span></span><span class="line"><span class="cl"><span class="n">```</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">```{r, eval=do_it}
</span></span></span><span class="line"><span class="cl"><span class="n">x = rnorm(100)
</span></span></span><span class="line"><span class="cl"><span class="n">```</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><code>echo=TRUE</code> ：输出源代码；</p>
</li>
<li>
<p><code>result</code> ：当设置为 <code>'hide'</code> ，文本输出将被隐藏；当设置为 <code>'asis'</code> ，文本输出将被 “原样” 书写。</p>
</li>
<li>
<p><code>collapse=TRUE</code> ：将文本输出和源代码合并为单个代码块输出，更加紧凑；</p>
</li>
<li>
<p><code>warning</code>, <code>message</code>,  <code>error</code> ：是否在输出文档中显示警告、消息和错误；</p>
</li>
<li>
<p><code>include=FALSE</code> ：运行当前代码并且不显示任何源代码与输出结果；</p>
</li>
<li>
<p><code>cache</code> ：是否启用高速缓存。如果启用了缓存，则在下一次编译文档时不会对相同的代码块进行评估（如果代码块没有被修改），这将节省您的时间；</p>
</li>
<li>
<p><code>fig.width</code>，<code>fig.height</code> ：（图形设备）块的大小（英寸）。注意：<code>fig.dim = c(6, 4)</code> 意味着 <code>fig.width = 6</code> 并且 <code>fig.height = 4</code>；</p>
</li>
<li>
<p><code>out.width</code>， <code>out.height</code> ：输出文档中 R 图片的输出大小。可以使用百分比，例如 <code>out.width = '80%'</code> 表示页面宽度的 80%；</p>
</li>
<li>
<p><code>fig.align</code> ：图片的对齐方式；</p>
</li>
<li>
<p><code>dev</code> ：图形设备保存 R 图片的格式。如 <code>'pdf'</code>, <code>'png'</code>, <code>'svg'</code>, <code>'jpeg'</code>；</p>
</li>
<li>
<p><code>fig.cap</code> ：图片标题；</p>
</li>
<li>
<p><code>child</code> ：您可以在主文档中包含子文档。这个选项选择一条通向外部文件的路径。</p>
</li>
</ul>
<p>如果某个选项需要经常被设置为多个代码块中的值，您可以考虑在文档的第一个代码块中全局设置它：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-R" data-lang="R"><span class="line"><span class="cl"><span class="n">```{r, setup, include=FALSE}
</span></span></span><span class="line"><span class="cl"><span class="n">knitr::opts_chunk$set(fig.width = 8, collapse = TRUE)
</span></span></span><span class="line"><span class="cl"><span class="n">```</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="图片">图片</h3>
<p>本地图片亦可以使用代码块选项进行调节，例如：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-R" data-lang="R"><span class="line"><span class="cl"><span class="n">```{r, out.width=&#39;25%&#39;, fig.align=&#39;center&#39;, fig.cap=&#39;...&#39;}
</span></span></span><span class="line"><span class="cl"><span class="n">knitr::include_graphics(&#39;images/hex-rmarkdown.png&#39;)
</span></span></span><span class="line"><span class="cl"><span class="n">```</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>如果您想要淡入一个不是由 R 代码生成的图形，您可以使用 <code>knitr::include_graphics()</code>  函数，它使您能够更好地控制图像的属性，而不是像 <code>![alt text or image title](path/to/image)</code> 这样的 Markdown 语法难以调解图片属性。</p>
<h3 id="表格">表格</h3>
<p>使用 <code>knitr::kable()</code>  函数可以简易的创建表格，表格标题可以通过 <code>caption</code>  来设置，例如：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-R" data-lang="R"><span class="line"><span class="cl"><span class="n">```{r tables-mtcars}
</span></span></span><span class="line"><span class="cl"><span class="n">knitr::kable(iris[1:5, ], caption = &#39;A caption&#39;)
</span></span></span><span class="line"><span class="cl"><span class="n">```</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>如果您正在寻找更高级的表格样式控制，建议您使用 <a href="https://cran.r-project.org/package=kableExtra" target="_blank" rel="noopener noreffer">kableExtra</a> 包，它提供了定制 PDF 和 HTML 表格外观的功能。在第 12.3 节中解释了 <code>bookdown</code> 包如何扩展 rmarkdown 的功能，以允许在文本中轻松地交叉引用数字和表格。</p>
<blockquote>
<p><strong>参考文献</strong></p>
<ul>
<li>Xie, Yihui. 2015. <em>Dynamic Documents with R and Knitr</em>. 2nd ed. Boca Raton, Florida: Chapman; Hall/CRC. <a href="https://yihui.name/knitr/" target="_blank" rel="noopener noreffer">https://yihui.name/knitr/</a>.</li>
</ul>
</blockquote>
<hr>
<h1 id="输出文档">输出文档</h1>
<h2 id="html-文档">HTML 文档</h2>
<p>为了输出 HTML 文档，首先要在 YAML 元数据中写入 <code>output: html_document</code> ：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="l">Habits</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">author</span><span class="p">:</span><span class="w"> </span><span class="l">John Doe</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">date</span><span class="p">:</span><span class="w"> </span><span class="l">March 22, 2005</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">output</span><span class="p">:</span><span class="w"> </span><span class="l">html_document</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nn">---</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="目录table-of-contents">目录（Table of contents）</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Habits&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">output</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">html_document</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">toc</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">toc_depth</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">toc_float</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">collapsed</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">smooth_scroll</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nn">---</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li><code>toc: true</code> ：输出目录；</li>
<li><code>toc_depth</code> ：所输出标题的最小级别；</li>
<li><code>toc_float: true</code> ：目录悬停于内容左侧，并一直可见；</li>
<li><code>collapsed</code> (默认为 <code>TRUE</code>)  ：初始只显示顶级标题，随内容滚动目录逐级展开；</li>
<li><code>smooth_scroll</code> (默认为 <code>TRUE</code>) ：点击目录标题是否导航到指定内容。</li>
</ul>
<h3 id="目录编号-section-numbering">目录编号 (Section numbering)</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Habits&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">output</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">html_document</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">toc</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">number_sections</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nn">---</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>注意，如果文档中没有一级标题，那么二级标题将被命名为 <code>0.1</code>, <code>0.2</code> ……</p>
<h3 id="选项卡-tabbed-sections">选项卡 (Tabbed sections)</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="gu">## Quarterly Results {.tabset .tabset-fade .tabset-pills}
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>
</span></span><span class="line"><span class="cl"><span class="gu">### By Product
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>
</span></span><span class="line"><span class="cl">(tab content)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">### By Region
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>
</span></span><span class="line"><span class="cl">(tab content)
</span></span></code></pre></td></tr></table>
</div>
</div><p><img
        class="lazyload"
        data-src="https://bookdown.org/yihui/rmarkdown/images/tabset.png"
        data-srcset="https://bookdown.org/yihui/rmarkdown/images/tabset.png, https://bookdown.org/yihui/rmarkdown/images/tabset.png 1.5x, https://bookdown.org/yihui/rmarkdown/images/tabset.png 2x"
        data-sizes="auto"
        alt="https://bookdown.org/yihui/rmarkdown/images/tabset.png"
        title="Tabbed sections"
    /></p>
<ul>
<li><code>.tabset</code>  ：使主标题的所有子标题与 .tabset 属性一起出现在选项卡中，而不是作为独立的部分；</li>
<li><code>.tabset-fade</code>  ：选项卡切换时淡入淡出；</li>
<li><code>.tabset-pills</code>  ：改变选项卡外观，使其类似 “药丸”。</li>
</ul>
<h3 id="外观与风格">外观与风格</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Habits&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">output</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">html_document</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">theme</span><span class="p">:</span><span class="w"> </span><span class="l">united</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">highlight</span><span class="p">:</span><span class="w"> </span><span class="l">tango</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nn">---</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li><code>theme</code>  ：主题是从 <a href="https://bootswatch.com/3/" target="_blank" rel="noopener noreffer">Bootswatch</a> 主题库中提取的，适用的主题包括：<code>default</code>, <code>cerulean</code>, <code>journal</code>, <code>flatly</code>, <code>readable</code>, <code>spacelab</code>, <code>united</code>, <code>cosmo</code>, <code>lumen</code>, <code>paper</code>, <code>sandstone</code>, <code>simplex</code>, 和 <code>yeti</code>.</li>
<li><code>highlight</code> ：代码高亮模式。支持的风格包括： <code>default</code>,  <code>tango</code>,  <code>pygments</code>,  <code>kate</code>,  <code>monochrome</code>,  <code>espresso</code>,  <code>zenburn</code>,  <code>haddock</code> 和 <code>textmate</code>.</li>
</ul>
<h3 id="图片选项">图片选项</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Habits&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">output</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">html_document</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">fig_width</span><span class="p">:</span><span class="w"> </span><span class="m">7</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">fig_height</span><span class="p">:</span><span class="w"> </span><span class="m">6</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">fig_caption</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nn">---</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li><code>fig_width</code> 和 <code>fig_height</code>  ：图片宽度和高度；</li>
<li><code>fig_caption</code>  ：控制图片是否包括标题；</li>
<li><code>dev</code>  ：图片渲染格式，默认为 <code>png</code>。</li>
</ul>
<h3 id="表格打印">表格打印</h3>
<p>默认表格输出格式为：</p>
<table>
<thead>
<tr>
<th style="text-align:center">Option</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">default</td>
<td style="text-align:left">Call the <code>print.data.frame</code> generic method</td>
</tr>
<tr>
<td style="text-align:center">kable</td>
<td style="text-align:left">Use the <code>knitr::kable</code> function</td>
</tr>
<tr>
<td style="text-align:center">tibble</td>
<td style="text-align:left">Use the <code>tibble::print.tbl_df</code> function</td>
</tr>
<tr>
<td style="text-align:center">paged</td>
<td style="text-align:left">Use <code>rmarkdown::print.paged_df</code> to create a pageable table</td>
</tr>
</tbody>
</table>
<p>设定为 paged 格式后输出形式为：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Motor Trend Car Road Tests&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">output</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">html_document</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">df_print</span><span class="p">:</span><span class="w"> </span><span class="l">paged</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="l">​``` {r, rows.print=5}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="l">mtcars</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="l">​``` </span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p><img
        class="lazyload"
        data-src="https://bookdown.org/yihui/rmarkdown/images/paged.png"
        data-srcset="https://bookdown.org/yihui/rmarkdown/images/paged.png, https://bookdown.org/yihui/rmarkdown/images/paged.png 1.5x, https://bookdown.org/yihui/rmarkdown/images/paged.png 2x"
        data-sizes="auto"
        alt="https://bookdown.org/yihui/rmarkdown/images/paged.png"
        title="mtcars"
    /></p>
<p>TABLE 3.2: The options for paged HTML tables.</p>
<table>
<thead>
<tr>
<th>Option</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>max.print</td>
<td>The number of rows to print.</td>
</tr>
<tr>
<td>max.print</td>
<td>The number of rows to print.</td>
</tr>
<tr>
<td>cols.print</td>
<td>The number of columns to display.</td>
</tr>
<tr>
<td>cols.min.print</td>
<td>The minimum number of columns to display.</td>
</tr>
<tr>
<td>pages.print</td>
<td>The number of pages to display under page navigation.</td>
</tr>
<tr>
<td>pages.print</td>
<td>The number of pages to display under page navigation.</td>
</tr>
<tr>
<td>rownames.print</td>
<td>When set to <code>FALSE</code> turns off row names.</td>
</tr>
</tbody>
</table>
<h3 id="代码折叠">代码折叠</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Habits&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">output</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">html_document</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">code_folding</span><span class="p">:</span><span class="w"> </span><span class="l">hide</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nn">---</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li><code>code_folding: hide</code> ：初始默认不显示代码，查看者可点击进行显示；</li>
<li><code>code_folding: show</code> ：初始默认显示代码，查看者可点击进行隐藏；</li>
</ul>
<h3 id="高级定制">高级定制</h3>
<h4 id="保留-markdown-文件">保留 Markdown 文件</h4>
<p>当运行一个 R Markdown 文件（<code>*.Rmd</code>）时，将创造一个 Markdown 文件（<code>*.md</code>）并将该文件通过 Pandoc 转换为 HTML 文件。如果想要保留 Markdown 文件，可以使用 <code>keep_md</code> 选项：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Habits&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">output</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">html_document</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">keep_md</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nn">---</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><h4 id="添加本地-html-文档">添加本地 HTML 文档</h4>
<p>可以通过添加额外的 HTML 内容或完全替换核心 Pandoc 模板来完成更高级的输出定制。为了在文档头部或文档主体之前/之后包含内容，您可以使用以下选项：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Habits&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">output</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">html_document</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">includes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">in_header</span><span class="p">:</span><span class="w"> </span><span class="l">header.html</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">before_body</span><span class="p">:</span><span class="w"> </span><span class="l">doc_prefix.html</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">after_body</span><span class="p">:</span><span class="w"> </span><span class="l">doc_suffix.html</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nn">---</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><h4 id="自定义模板">自定义模板</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Habits&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">output</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">html_document</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">template</span><span class="p">:</span><span class="w"> </span><span class="l">quarterly_report.html</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nn">---</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>有关模板的其他详细信息，请参考 <a href="https://pandoc.org/MANUAL.html#templates" target="_blank" rel="noopener noreffer">Pandoc 模板</a> 上的文档。您还可以研究默认的 HTML 模板 <a href="https://github.com/jgm/pandoc-templates/" target="_blank" rel="noopener noreffer"><code>default.html5</code></a> 。</p>
<p>其他类型文档格式控制方式类似，如欲详细了解请 <a href="https://bookdown.org/yihui/rmarkdown/documents.html" target="_blank" rel="noopener noreffer">参考原作</a> 。</p>]]></content:encoded></item><item><title>数据可视化-formattable包</title><link>https://philohao.com/2018/03/20180322/</link><pubDate>Thu, 22 Mar 2018 14:00:11 +0800</pubDate><dc:creator>Jianfeng.Hao</dc:creator><author>haojianfeng1997@gmail.com (Jianfeng.Hao)</author><guid isPermaLink="true">https://philohao.com/2018/03/20180322/</guid><description>R 语言 formattable 包使用笔记，记录表格格式化和可读性增强方法。</description><content:encoded><![CDATA[<center><i>
    该软件包使用预定义的格式化规则更加丰富形象地展示数据，<br />
    在存储原始数据的同时将输出结果用格式化输出，使数据在保留原有属性的基础上更加易读
</i></center>
<h2 id="加载包">加载包</h2>
<p>这个包的功能很简单，但是却很具创意性，它颠覆了 R 语言数据以及数据表的呈现方式，数据方面提供了百分数、会计技术等多个 R 尚未支持的数据格式；数据表方面支持自定义视觉化元素，如对某一列数据进行字号、颜色、背景、以及图形化处理，整体的版式仍然保留表格的样式，但是已经具有了表和图结合的意味。</p>
<p>首先加载所需的程序包：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="n">devtools</span><span class="o">::</span><span class="nf">install_github</span><span class="p">(</span><span class="s">&#34;renkun-ken/formattable&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nf">install.packages</span><span class="p">(</span><span class="s">&#34;formattable&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nf">library</span><span class="p">(</span><span class="s">&#34;formattable&#34;</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><br />
<hr>
<h2 id="格式化数据">格式化数据</h2>
<p>该包提供了几个典型的可格式化对象，它们包括：<code>percent</code>, <code>comma</code>, <code>currency</code>, <code>accounting</code> 和 <code>scientific</code> 。这些对象实质上是具有预定义格式规则和参数的数值型向量。</p>
<h3 id="percent">percent</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="nf">percent</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">digits</span> <span class="o">=</span> <span class="m">2L</span><span class="p">,</span> <span class="n">format</span> <span class="o">=</span> <span class="s">&#34;f&#34;</span><span class="p">,</span> <span class="kc">...</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## Default S3 method:</span>
</span></span><span class="line"><span class="cl"><span class="nf">percent</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">digits</span> <span class="o">=</span> <span class="m">2L</span><span class="p">,</span> <span class="n">format</span> <span class="o">=</span> <span class="s">&#34;f&#34;</span><span class="p">,</span> <span class="kc">...</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## S3 method for class &#39;character&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nf">percent</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">digits</span> <span class="o">=</span> <span class="kc">NA</span><span class="p">,</span> <span class="n">format</span> <span class="o">=</span> <span class="s">&#34;f&#34;</span><span class="p">,</span> <span class="kc">...</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>参数列表：
x：数值型向量
digits：一个整数，用于指示百分比字符串的位数
format：格式类型，传递给formatC</p>
</blockquote>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="n">p</span> <span class="o">&lt;-</span> <span class="nf">percent</span><span class="p">(</span><span class="nf">c</span><span class="p">(</span><span class="m">0.1</span><span class="p">,</span> <span class="m">0.02</span><span class="p">,</span> <span class="m">0.03</span><span class="p">,</span> <span class="m">0.12</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="c1"># 函数保留了保留其数学运算属性</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">p</span> <span class="o">+</span> <span class="m">0.05</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">15.00</span><span class="o">% 7.00%</span>  <span class="m">8.00</span><span class="o">%  17.00%</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">mean</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">6.75</span>%
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="c1"># formattable格式继承了numeric属性，因而保留了数学运算能力</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">class</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="s">&#34;formattable&#34;</span> <span class="s">&#34;numeric&#34;</span> 
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h3 id="comma">comma</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="nf">comma</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">digits</span><span class="p">,</span> <span class="n">format</span> <span class="o">=</span> <span class="s">&#34;f&#34;</span><span class="p">,</span> <span class="n">big.mark</span> <span class="o">=</span> <span class="s">&#34;,&#34;</span><span class="p">,</span> <span class="kc">...</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## Default S3 method:</span>
</span></span><span class="line"><span class="cl"><span class="nf">comma</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">digits</span> <span class="o">=</span> <span class="m">2L</span><span class="p">,</span> <span class="n">format</span> <span class="o">=</span> <span class="s">&#34;f&#34;</span><span class="p">,</span> <span class="n">big.mark</span> <span class="o">=</span> <span class="s">&#34;,&#34;</span><span class="p">,</span> <span class="kc">...</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## S3 method for class &#39;character&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nf">comma</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">digits</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="nf">get_digits</span><span class="p">(</span><span class="n">x</span><span class="p">)),</span> <span class="n">format</span> <span class="o">=</span> <span class="s">&#34;f&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">big.mark</span> <span class="o">=</span> <span class="s">&#34;,&#34;</span><span class="p">,</span> <span class="kc">...</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>参数列表：
x：数值型向量
digits：一个整数，用于指示百分比字符串的位数
format：格式类型，传递给formatC</p>
</blockquote>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">comma</span><span class="p">(</span><span class="m">1000000</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">1</span><span class="p">,</span><span class="m">000</span><span class="p">,</span><span class="m">000.00</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">comma</span><span class="p">(</span><span class="nf">c</span><span class="p">(</span><span class="m">1250000</span><span class="p">,</span> <span class="m">225000</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">1</span><span class="p">,</span><span class="m">250</span><span class="p">,</span><span class="m">000.00</span> <span class="m">225</span><span class="p">,</span><span class="m">000.00</span>  
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">comma</span><span class="p">(</span><span class="nf">c</span><span class="p">(</span><span class="m">1250000</span><span class="p">,</span> <span class="m">225000</span><span class="p">),</span> <span class="n">format</span> <span class="o">=</span> <span class="s">&#34;d&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">1</span><span class="p">,</span><span class="m">250</span><span class="p">,</span><span class="m">000</span> <span class="m">225</span><span class="p">,</span><span class="m">000</span>  
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">comma</span><span class="p">(</span><span class="s">&#34;123,345.123&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">123</span><span class="p">,</span><span class="m">345.123</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h3 id="currency">currency</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="nf">currency</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">symbol</span><span class="p">,</span> <span class="n">digits</span><span class="p">,</span> <span class="n">format</span> <span class="o">=</span> <span class="s">&#34;f&#34;</span><span class="p">,</span> <span class="n">big.mark</span> <span class="o">=</span> <span class="s">&#34;,&#34;</span><span class="p">,</span> <span class="kc">...</span><span class="p">,</span> <span class="n">sep</span> <span class="o">=</span> <span class="s">&#34;&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## Default S3 method:</span>
</span></span><span class="line"><span class="cl"><span class="nf">currency</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">symbol</span> <span class="o">=</span> <span class="s">&#34;$&#34;</span><span class="p">,</span> <span class="n">digits</span> <span class="o">=</span> <span class="m">2L</span><span class="p">,</span> <span class="n">format</span> <span class="o">=</span> <span class="s">&#34;f&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">big.mark</span> <span class="o">=</span> <span class="s">&#34;,&#34;</span><span class="p">,</span> <span class="kc">...</span><span class="p">,</span> <span class="n">sep</span> <span class="o">=</span> <span class="s">&#34;&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## S3 method for class &#39;character&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nf">currency</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">symbol</span> <span class="o">=</span> <span class="nf">get_currency_symbol</span><span class="p">(</span><span class="n">x</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">  <span class="n">digits</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="nf">get_digits</span><span class="p">(</span><span class="n">x</span><span class="p">)),</span> <span class="n">format</span> <span class="o">=</span> <span class="s">&#34;f&#34;</span><span class="p">,</span> <span class="n">big.mark</span> <span class="o">=</span> <span class="s">&#34;,&#34;</span><span class="p">,</span> <span class="kc">...</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>参数列表：
x：数值型向量
symbol：货币符号
digits：一个整数，用于指示百分比字符串的位数
format：格式类型，传递给formatC
big.mark：千分隔符
sep：符号和值之间的分隔符</p>
</blockquote>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">currency</span><span class="p">(</span><span class="m">200000</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="o">$</span><span class="m">200</span><span class="p">,</span><span class="m">000.00</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">currency</span><span class="p">(</span><span class="m">1200000</span><span class="p">,</span> <span class="s">&#34;USD&#34;</span><span class="p">,</span> <span class="n">format</span> <span class="o">=</span> <span class="s">&#34;d&#34;</span><span class="p">,</span> <span class="n">sep</span> <span class="o">=</span> <span class="s">&#34; &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="n">USD</span> <span class="m">1</span><span class="p">,</span><span class="m">200</span><span class="p">,</span><span class="m">000</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">currency</span><span class="p">(</span><span class="s">&#34;$ 120,250.50&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="o">$</span><span class="m">120</span><span class="p">,</span><span class="m">250.50</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">currency</span><span class="p">(</span><span class="s">&#34;HK$ 120, 250.50&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="n">HK</span><span class="o">$</span><span class="m">120</span><span class="p">,</span><span class="m">250.50</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h3 id="accounting">accounting</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="nf">accounting</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">digits</span> <span class="o">=</span> <span class="m">2L</span><span class="p">,</span> <span class="n">format</span> <span class="o">=</span> <span class="s">&#34;f&#34;</span><span class="p">,</span> <span class="n">big.mark</span> <span class="o">=</span> <span class="s">&#34;,&#34;</span><span class="p">,</span> <span class="kc">...</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## Default S3 method:</span>
</span></span><span class="line"><span class="cl"><span class="nf">accounting</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">digits</span> <span class="o">=</span> <span class="m">2L</span><span class="p">,</span> <span class="n">format</span> <span class="o">=</span> <span class="s">&#34;f&#34;</span><span class="p">,</span> <span class="n">big.mark</span> <span class="o">=</span> <span class="s">&#34;,&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="kc">...</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## S3 method for class &#39;character&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nf">accounting</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">digits</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="nf">get_digits</span><span class="p">(</span><span class="n">x</span><span class="p">)),</span> <span class="n">format</span> <span class="o">=</span> <span class="s">&#34;f&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">big.mark</span> <span class="o">=</span> <span class="s">&#34;,&#34;</span><span class="p">,</span> <span class="kc">...</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>参数列表：
x：数值型向量
digits：一个整数，用于指示小数位数
format：格式类型，传递给formatC
big.mark：千分隔符</p>
</blockquote>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="c1"># 两位小数，同时负值加括号</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">balance</span> <span class="o">&lt;-</span> <span class="nf">accounting</span><span class="p">(</span><span class="nf">c</span><span class="p">(</span><span class="m">1000</span><span class="p">,</span> <span class="m">500</span><span class="p">,</span> <span class="m">200</span><span class="p">,</span> <span class="m">-150</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">1200</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">balance</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">1</span><span class="p">,</span><span class="m">000.00</span> <span class="m">500.00</span>   <span class="m">200.00</span>   <span class="p">(</span><span class="m">150.00</span><span class="p">)</span> <span class="m">0.00</span>     <span class="m">1</span><span class="p">,</span><span class="m">200.00</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">accounting</span><span class="p">(</span><span class="nf">c</span><span class="p">(</span><span class="m">1200</span><span class="p">,</span> <span class="m">-3500</span><span class="p">,</span> <span class="m">2600</span><span class="p">),</span> <span class="n">format</span> <span class="o">=</span> <span class="s">&#34;d&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">1</span><span class="p">,</span><span class="m">200</span>   <span class="p">(</span><span class="m">3</span><span class="p">,</span><span class="m">500</span><span class="p">)</span> <span class="m">2</span><span class="p">,</span><span class="m">600</span>  
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="c1"># 函数保留了保留其数学运算属性</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">balance</span> <span class="o">+</span> <span class="m">1000</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">2</span><span class="p">,</span><span class="m">000.00</span> <span class="m">1</span><span class="p">,</span><span class="m">500.00</span> <span class="m">1</span><span class="p">,</span><span class="m">200.00</span> <span class="m">850.00</span>   <span class="m">1</span><span class="p">,</span><span class="m">000.00</span> <span class="m">2</span><span class="p">,</span><span class="m">200.00</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h3 id="scientific">scientific</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="nf">scientific</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">format</span> <span class="o">=</span> <span class="nf">c</span><span class="p">(</span><span class="s">&#34;e&#34;</span><span class="p">,</span> <span class="s">&#34;E&#34;</span><span class="p">),</span> <span class="n">digits</span> <span class="o">=</span> <span class="m">4</span><span class="p">,</span> <span class="kc">...</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>参数列表：
x：数值型向量
digits：一个整数，用于指示小数位数
format：格式类型，传递给formatC</p>
</blockquote>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">scientific</span><span class="p">(</span><span class="m">1253421</span><span class="p">,</span> <span class="n">digits</span> <span class="o">=</span> <span class="m">8</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">1.25342100e+06</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">scientific</span><span class="p">(</span><span class="m">1253421</span><span class="p">,</span> <span class="n">digits</span> <span class="o">=</span> <span class="m">8</span><span class="p">,</span> <span class="n">format</span> <span class="o">=</span> <span class="s">&#34;E&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">1.25342100E+06</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h3 id="复杂数据结构">复杂数据结构</h3>
<p><code>formattable()</code> 将高度可定制的格式应用于各种类的对象，如 <code>numeric</code>, <code>logical</code>, <code>factor</code>, <code>Date</code>, <code>data.frame</code> 等。例如，数据框可能也可存储格式化的列向量（这是自然地，因为数据框就是由若干个等长的向量组成的）：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">df</span> <span class="o">&lt;-</span> <span class="nf">data.frame</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>   <span class="n">id</span> <span class="o">=</span> <span class="nf">c</span><span class="p">(</span><span class="m">1</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="m">3</span><span class="p">,</span> <span class="m">4</span><span class="p">,</span> <span class="m">5</span><span class="p">),</span> 
</span></span><span class="line"><span class="cl"><span class="o">+</span>   <span class="n">name</span> <span class="o">=</span> <span class="nf">c</span><span class="p">(</span><span class="s">&#34;A1&#34;</span><span class="p">,</span> <span class="s">&#34;A2&#34;</span><span class="p">,</span> <span class="s">&#34;B1&#34;</span><span class="p">,</span> <span class="s">&#34;B2&#34;</span><span class="p">,</span> <span class="s">&#34;C1&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>   <span class="n">balance</span> <span class="o">=</span> <span class="nf">accounting</span><span class="p">(</span><span class="nf">c</span><span class="p">(</span><span class="m">52500</span><span class="p">,</span> <span class="m">36150</span><span class="p">,</span> <span class="m">25000</span><span class="p">,</span> <span class="m">18300</span><span class="p">,</span> <span class="m">7600</span><span class="p">),</span> <span class="n">format</span> <span class="o">=</span> <span class="s">&#34;d&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>   <span class="n">growth</span> <span class="o">=</span> <span class="nf">percent</span><span class="p">(</span><span class="nf">c</span><span class="p">(</span><span class="m">0.3</span><span class="p">,</span> <span class="m">0.3</span><span class="p">,</span> <span class="m">0.1</span><span class="p">,</span> <span class="m">0.15</span><span class="p">,</span> <span class="m">0.15</span><span class="p">),</span> <span class="n">format</span> <span class="o">=</span> <span class="s">&#34;d&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>   <span class="n">ready</span> <span class="o">=</span> <span class="nf">formattable</span><span class="p">(</span><span class="nf">c</span><span class="p">(</span><span class="kc">TRUE</span><span class="p">,</span> <span class="kc">TRUE</span><span class="p">,</span> <span class="kc">FALSE</span><span class="p">,</span> <span class="kc">FALSE</span><span class="p">,</span> <span class="kc">TRUE</span><span class="p">),</span> <span class="s">&#34;yes&#34;</span><span class="p">,</span> <span class="s">&#34;no&#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">df</span>
</span></span><span class="line"><span class="cl">  <span class="n">id</span> <span class="n">name</span> <span class="n">balance</span> <span class="n">growth</span> <span class="n">ready</span>
</span></span><span class="line"><span class="cl"><span class="m">1</span>  <span class="m">1</span>   <span class="n">A1</span>  <span class="m">52</span><span class="p">,</span><span class="m">500</span>    <span class="m">30</span><span class="o">%   yes
</span></span></span><span class="line"><span class="cl"><span class="o">2  2   A2  36,150    30%</span>   <span class="n">yes</span>
</span></span><span class="line"><span class="cl"><span class="m">3</span>  <span class="m">3</span>   <span class="n">B1</span>  <span class="m">25</span><span class="p">,</span><span class="m">000</span>    <span class="m">10</span><span class="o">%    no
</span></span></span><span class="line"><span class="cl"><span class="o">4  4   B2  18,300    15%</span>    <span class="n">no</span>
</span></span><span class="line"><span class="cl"><span class="m">5</span>  <span class="m">5</span>   <span class="n">C1</span>   <span class="m">7</span><span class="p">,</span><span class="m">600</span>    <span class="m">15</span>%   <span class="n">yes</span>
</span></span></code></pre></td></tr></table>
</div>
</div><br />
<hr>
<h2 id="格式化数据表">格式化数据表</h2>
<h3 id="举个栗子">举个栗子</h3>
<p>普通的表格数据如下所示：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">df</span> <span class="o">&lt;-</span> <span class="nf">data.frame</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>   <span class="n">id</span> <span class="o">=</span> <span class="m">1</span><span class="o">:</span><span class="m">10</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>   <span class="n">name</span> <span class="o">=</span> <span class="nf">c</span><span class="p">(</span><span class="s">&#34;Bob&#34;</span><span class="p">,</span> <span class="s">&#34;Ashley&#34;</span><span class="p">,</span> <span class="s">&#34;James&#34;</span><span class="p">,</span> <span class="s">&#34;David&#34;</span><span class="p">,</span> <span class="s">&#34;Jenny&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl"><span class="o">+</span>            <span class="s">&#34;Hans&#34;</span><span class="p">,</span> <span class="s">&#34;Leo&#34;</span><span class="p">,</span> <span class="s">&#34;John&#34;</span><span class="p">,</span> <span class="s">&#34;Emily&#34;</span><span class="p">,</span> <span class="s">&#34;Lee&#34;</span><span class="p">),</span> 
</span></span><span class="line"><span class="cl"><span class="o">+</span>   <span class="n">age</span> <span class="o">=</span> <span class="nf">c</span><span class="p">(</span><span class="m">28</span><span class="p">,</span> <span class="m">27</span><span class="p">,</span> <span class="m">30</span><span class="p">,</span> <span class="m">28</span><span class="p">,</span> <span class="m">29</span><span class="p">,</span> <span class="m">29</span><span class="p">,</span> <span class="m">27</span><span class="p">,</span> <span class="m">27</span><span class="p">,</span> <span class="m">31</span><span class="p">,</span> <span class="m">30</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>   <span class="n">grade</span> <span class="o">=</span> <span class="nf">c</span><span class="p">(</span><span class="s">&#34;C&#34;</span><span class="p">,</span> <span class="s">&#34;A&#34;</span><span class="p">,</span> <span class="s">&#34;A&#34;</span><span class="p">,</span> <span class="s">&#34;C&#34;</span><span class="p">,</span> <span class="s">&#34;B&#34;</span><span class="p">,</span> <span class="s">&#34;B&#34;</span><span class="p">,</span> <span class="s">&#34;B&#34;</span><span class="p">,</span> <span class="s">&#34;A&#34;</span><span class="p">,</span> <span class="s">&#34;C&#34;</span><span class="p">,</span> <span class="s">&#34;C&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>   <span class="n">test1_score</span> <span class="o">=</span> <span class="nf">c</span><span class="p">(</span><span class="m">8.9</span><span class="p">,</span> <span class="m">9.5</span><span class="p">,</span> <span class="m">9.6</span><span class="p">,</span> <span class="m">8.9</span><span class="p">,</span> <span class="m">9.1</span><span class="p">,</span> <span class="m">9.3</span><span class="p">,</span> <span class="m">9.3</span><span class="p">,</span> <span class="m">9.9</span><span class="p">,</span> <span class="m">8.5</span><span class="p">,</span> <span class="m">8.6</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>   <span class="n">test2_score</span> <span class="o">=</span> <span class="nf">c</span><span class="p">(</span><span class="m">9.1</span><span class="p">,</span> <span class="m">9.1</span><span class="p">,</span> <span class="m">9.2</span><span class="p">,</span> <span class="m">9.1</span><span class="p">,</span> <span class="m">8.9</span><span class="p">,</span> <span class="m">8.5</span><span class="p">,</span> <span class="m">9.2</span><span class="p">,</span> <span class="m">9.3</span><span class="p">,</span> <span class="m">9.1</span><span class="p">,</span> <span class="m">8.8</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>   <span class="n">final_score</span> <span class="o">=</span> <span class="nf">c</span><span class="p">(</span><span class="m">9</span><span class="p">,</span> <span class="m">9.3</span><span class="p">,</span> <span class="m">9.4</span><span class="p">,</span> <span class="m">9</span><span class="p">,</span> <span class="m">9</span><span class="p">,</span> <span class="m">8.9</span><span class="p">,</span> <span class="m">9.25</span><span class="p">,</span> <span class="m">9.6</span><span class="p">,</span> <span class="m">8.8</span><span class="p">,</span> <span class="m">8.7</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>   <span class="n">registered</span> <span class="o">=</span> <span class="nf">c</span><span class="p">(</span><span class="kc">TRUE</span><span class="p">,</span> <span class="kc">FALSE</span><span class="p">,</span> <span class="kc">TRUE</span><span class="p">,</span> <span class="kc">FALSE</span><span class="p">,</span> <span class="kc">TRUE</span><span class="p">,</span> <span class="kc">TRUE</span><span class="p">,</span> <span class="kc">TRUE</span><span class="p">,</span> <span class="kc">FALSE</span><span class="p">,</span> <span class="kc">FALSE</span><span class="p">,</span> <span class="kc">FALSE</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>   <span class="n">stringsAsFactors</span> <span class="o">=</span> <span class="kc">FALSE</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">df</span>
</span></span><span class="line"><span class="cl">   <span class="n">id</span>   <span class="n">name</span> <span class="n">age</span> <span class="n">grade</span> <span class="n">test1_score</span> <span class="n">test2_score</span> <span class="n">final_score</span> <span class="n">registered</span>
</span></span><span class="line"><span class="cl"><span class="m">1</span>   <span class="m">1</span>    <span class="n">Bob</span>  <span class="m">28</span>     <span class="n">C</span>         <span class="m">8.9</span>         <span class="m">9.1</span>        <span class="m">9.00</span>       <span class="kc">TRUE</span>
</span></span><span class="line"><span class="cl"><span class="m">2</span>   <span class="m">2</span> <span class="n">Ashley</span>  <span class="m">27</span>     <span class="n">A</span>         <span class="m">9.5</span>         <span class="m">9.1</span>        <span class="m">9.30</span>      <span class="kc">FALSE</span>
</span></span><span class="line"><span class="cl"><span class="m">3</span>   <span class="m">3</span>  <span class="n">James</span>  <span class="m">30</span>     <span class="n">A</span>         <span class="m">9.6</span>         <span class="m">9.2</span>        <span class="m">9.40</span>       <span class="kc">TRUE</span>
</span></span><span class="line"><span class="cl"><span class="m">4</span>   <span class="m">4</span>  <span class="n">David</span>  <span class="m">28</span>     <span class="n">C</span>         <span class="m">8.9</span>         <span class="m">9.1</span>        <span class="m">9.00</span>      <span class="kc">FALSE</span>
</span></span><span class="line"><span class="cl"><span class="m">5</span>   <span class="m">5</span>  <span class="n">Jenny</span>  <span class="m">29</span>     <span class="n">B</span>         <span class="m">9.1</span>         <span class="m">8.9</span>        <span class="m">9.00</span>       <span class="kc">TRUE</span>
</span></span><span class="line"><span class="cl"><span class="m">6</span>   <span class="m">6</span>   <span class="n">Hans</span>  <span class="m">29</span>     <span class="n">B</span>         <span class="m">9.3</span>         <span class="m">8.5</span>        <span class="m">8.90</span>       <span class="kc">TRUE</span>
</span></span><span class="line"><span class="cl"><span class="m">7</span>   <span class="m">7</span>    <span class="n">Leo</span>  <span class="m">27</span>     <span class="n">B</span>         <span class="m">9.3</span>         <span class="m">9.2</span>        <span class="m">9.25</span>       <span class="kc">TRUE</span>
</span></span><span class="line"><span class="cl"><span class="m">8</span>   <span class="m">8</span>   <span class="n">John</span>  <span class="m">27</span>     <span class="n">A</span>         <span class="m">9.9</span>         <span class="m">9.3</span>        <span class="m">9.60</span>      <span class="kc">FALSE</span>
</span></span><span class="line"><span class="cl"><span class="m">9</span>   <span class="m">9</span>  <span class="n">Emily</span>  <span class="m">31</span>     <span class="n">C</span>         <span class="m">8.5</span>         <span class="m">9.1</span>        <span class="m">8.80</span>      <span class="kc">FALSE</span>
</span></span><span class="line"><span class="cl"><span class="m">10</span> <span class="m">10</span>    <span class="n">Lee</span>  <span class="m">30</span>     <span class="n">C</span>         <span class="m">8.6</span>         <span class="m">8.8</span>        <span class="m">8.70</span>      <span class="kc">FALSE</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>格式化表格，具有以下可视化效果：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">formattable</span><span class="p">(</span><span class="n">df</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl"><span class="o">+</span>             <span class="nf">list</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>               <span class="n">age</span> <span class="o">=</span> <span class="nf">color_tile</span><span class="p">(</span><span class="s">&#34;white&#34;</span><span class="p">,</span> <span class="s">&#34;orange&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>               <span class="n">grade</span> <span class="o">=</span> <span class="nf">formatter</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>                 <span class="s">&#34;span&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl"><span class="o">+</span>                 <span class="n">style</span> <span class="o">=</span> <span class="n">x</span> <span class="o">~</span> <span class="nf">ifelse</span><span class="p">(</span><span class="n">x</span> <span class="o">==</span> <span class="s">&#34;A&#34;</span><span class="p">,</span> <span class="nf">style</span><span class="p">(</span><span class="n">color</span> <span class="o">=</span> <span class="s">&#34;green&#34;</span><span class="p">,</span> <span class="n">font.weight</span> <span class="o">=</span> <span class="s">&#34;bold&#34;</span><span class="p">),</span> <span class="kc">NA</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>               <span class="p">),</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>               <span class="nf">area</span><span class="p">(</span><span class="n">col</span> <span class="o">=</span> <span class="nf">c</span><span class="p">(</span><span class="n">test1_score</span><span class="p">,</span> <span class="n">test2_score</span><span class="p">))</span> <span class="o">~</span> <span class="nf">normalize_bar</span><span class="p">(</span><span class="s">&#34;pink&#34;</span><span class="p">,</span> <span class="m">0.2</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>               <span class="n">final_score</span> <span class="o">=</span> <span class="nf">formatter</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>                 <span class="s">&#34;span&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>                 <span class="n">style</span> <span class="o">=</span> <span class="n">x</span> <span class="o">~</span> <span class="nf">style</span><span class="p">(</span><span class="n">color</span> <span class="o">=</span> <span class="nf">ifelse</span><span class="p">(</span><span class="nf">rank</span><span class="p">(</span><span class="o">-</span><span class="n">x</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="m">3</span><span class="p">,</span> <span class="s">&#34;green&#34;</span><span class="p">,</span> <span class="s">&#34;gray&#34;</span><span class="p">)),</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>                 <span class="n">x</span> <span class="o">~</span> <span class="nf">sprintf</span><span class="p">(</span><span class="s">&#34;%.2f (rank: %02d)&#34;</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="nf">rank</span><span class="p">(</span><span class="o">-</span><span class="n">x</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>               <span class="p">),</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>               <span class="n">registered</span> <span class="o">=</span> <span class="nf">formatter</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>                 <span class="s">&#34;span&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>                 <span class="n">style</span> <span class="o">=</span> <span class="n">x</span> <span class="o">~</span> <span class="nf">style</span><span class="p">(</span><span class="n">color</span> <span class="o">=</span> <span class="nf">ifelse</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="s">&#34;green&#34;</span><span class="p">,</span> <span class="s">&#34;red&#34;</span><span class="p">)),</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>                 <span class="n">x</span> <span class="o">~</span> <span class="nf">icontext</span><span class="p">(</span><span class="nf">ifelse</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="s">&#34;ok&#34;</span><span class="p">,</span> <span class="s">&#34;remove&#34;</span><span class="p">),</span> <span class="nf">ifelse</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="s">&#34;Yes&#34;</span><span class="p">,</span> <span class="s">&#34;No&#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>               <span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>             <span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span> <span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><img
        class="lazyload"
        data-src="https://blog-1255524710.cos.ap-beijing.myqcloud.com/cover/formattable.png"
        data-srcset="https://blog-1255524710.cos.ap-beijing.myqcloud.com/cover/formattable.png, https://blog-1255524710.cos.ap-beijing.myqcloud.com/cover/formattable.png 1.5x, https://blog-1255524710.cos.ap-beijing.myqcloud.com/cover/formattable.png 2x"
        data-sizes="auto"
        alt="https://blog-1255524710.cos.ap-beijing.myqcloud.com/cover/formattable.png"
        title="formattable.png"
    /></p>
<p>表格中使用的图标集由<a href="GLYPHICONS.com" rel="">GLYPHICONS.com</a>提供并包含在<a href="https://getbootstrap.com/docs/3.3/components/" target="_blank" rel="noopener noreffer">Bootstrap</a>中。</p>
<p>注意到一共用了 <code>文字格式自定义、文字背景自定义、文本自定义</code> 三种自定义可视化类型：</p>
<blockquote>
<p>color_tile函数用于输出按照数值量级进行颜色背景填充的列。</p>
<p>formatter函数提供字体显示格式的自定义，grade列自定义了值为A的记录显示绿色，并将字体加粗，否则忽略。
test1_score, test2_score两列通过area函数在对应字体背景位置使用条形图来代表指标量级大小，颜色填充粉色。
final_score列对指标按照top3显示绿色，其余显示灰色，同时将内容显示格式自定义为浮点型+(rank:名次)进行显示。
registered列则在对填充颜色按照对应布尔值进行显示（TRUE显示绿色、FALSE显示红色）之外，在左侧添加了对用的icon文本（TRUE显示绿色对号，FALSE显示红色叉号）。</p>
</blockquote>
<hr>
<h3 id="文字格式自定义">文字格式自定义</h3>
<h4 id="color_text">color_text</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="nf">formattable</span><span class="p">(</span><span class="n">mtcars</span><span class="p">,</span> <span class="nf">list</span><span class="p">(</span><span class="n">mpg</span> <span class="o">=</span> <span class="nf">color_text</span><span class="p">(</span><span class="s">&#34;black&#34;</span><span class="p">,</span> <span class="s">&#34;red&#34;</span><span class="p">)))</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="formatter">formatter</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="nf">formatter</span><span class="p">(</span><span class="n">.tag</span><span class="p">,</span> <span class="n">style</span> <span class="o">=</span> <span class="kc">...</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>参数列表：
.tag：HTML 标签，默认为 span
style：CSS语句
注：类似 x ~ expr 的公式将表现得像 function(x) expr</p>
</blockquote>
<p>诸多CSS样式于此可见：<a href="https://www.w3.org/Style/CSS/all-properties" target="_blank" rel="noopener noreffer">List of CSS properties</a></p>
<h3 id="文字背景自定义">文字背景自定义</h3>
<h4 id="色块函数">色块函数</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="c1"># color_tile(&#34;color1&#34;, &#34;color2&#34;)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 输出按照数值量级进行颜色背景填充的列</span>
</span></span><span class="line"><span class="cl"><span class="nf">formattable</span><span class="p">(</span><span class="n">mtcars</span><span class="p">,</span> <span class="nf">list</span><span class="p">(</span><span class="n">mpg</span> <span class="o">=</span> <span class="nf">color_tile</span><span class="p">(</span><span class="s">&#34;white&#34;</span><span class="p">,</span> <span class="s">&#34;pink&#34;</span><span class="p">)))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># color_bar(color = &#34;lightgray&#34;, fun = &#34;proportion&#34;, ...)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 输出有颜色填充的，大小以数值量级为比例的色块</span>
</span></span><span class="line"><span class="cl"><span class="nf">formattable</span><span class="p">(</span><span class="n">mtcars</span><span class="p">,</span> <span class="nf">list</span><span class="p">(</span><span class="n">mpg</span> <span class="o">=</span> <span class="nf">color_bar</span><span class="p">(</span><span class="s">&#34;lightgray&#34;</span><span class="p">,</span> <span class="n">proportion</span><span class="p">)))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># normalize_bar(color = &#34;lightgray&#34;, ...)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># proportion_bar(color = &#34;lightgray&#34;, ...)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 按正常配置输出大小以数值量级为比例的色块</span>
</span></span><span class="line"><span class="cl"><span class="nf">formattable</span><span class="p">(</span><span class="n">mtcars</span><span class="p">,</span> <span class="nf">list</span><span class="p">(</span><span class="n">mpg</span> <span class="o">=</span> <span class="nf">normalize_bar</span><span class="p">()))</span>
</span></span><span class="line"><span class="cl"><span class="nf">formattable</span><span class="p">(</span><span class="n">mtcars</span><span class="p">,</span> <span class="nf">list</span><span class="p">(</span><span class="n">mpg</span> <span class="o">=</span> <span class="nf">proportion_bar</span><span class="p">()))</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="area">area</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="nf">area</span><span class="p">(</span><span class="n">row</span><span class="p">,</span> <span class="n">col</span><span class="p">)</span> <span class="o">~</span> <span class="n">formatter</span><span class="o">/</span><span class="n">normalize_bar</span>……
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>参数列表：
row/col：选取的行与列，默认为全选</p>
</blockquote>
<h3 id="文本自定义">文本自定义</h3>
<h4 id="icontext">icontext</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="nf">icontext</span><span class="p">(</span><span class="n">icon</span><span class="p">,</span> <span class="n">text</span> <span class="o">=</span> <span class="nf">list</span><span class="p">(</span><span class="kc">NULL</span><span class="p">),</span> <span class="kc">...</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>参数列表：
icon：图标名称的字符矢量或字符矢量列表
text：文本的字符向量</p>
</blockquote>
<p>使用的图标集由<a href="GLYPHICONS.com" rel="">GLYPHICONS.com</a>提供并包含在<a href="https://getbootstrap.com/docs/3.3/components/" target="_blank" rel="noopener noreffer">Bootstrap</a>中。</p>
<br />
<hr>
<h2 id="致谢">致谢</h2>
<blockquote>
<h3 id="参考文章">参考文章</h3>
<ul>
<li><a href="https://github.com/renkun-ken/formattable" target="_blank" rel="noopener noreffer">Github：任坤的formattable项目</a></li>
<li><a href="https://mp.weixin.qq.com/s/QAr7LYx4jgvOlNBVAUZX5g" target="_blank" rel="noopener noreffer">杜雨：一款脑洞大开的表格可视化神器</a></li>
</ul>
</blockquote>]]></content:encoded></item><item><title>数据操作-apply函数族</title><link>https://philohao.com/2018/03/20180315/</link><pubDate>Thu, 15 Mar 2018 12:19:00 +0800</pubDate><dc:creator>Jianfeng.Hao</dc:creator><author>haojianfeng1997@gmail.com (Jianfeng.Hao)</author><guid isPermaLink="true">https://philohao.com/2018/03/20180315/</guid><description>R 语言 apply 函数族学习笔记，记录不同数据结构下的循环处理方式。</description><content:encoded><![CDATA[<center><i>
    R 作为一种向量化的编程语言，一大特征便是以向量计算替代了循环计算，使效率大大提升。<br>
    apply函数族正是为解决数据循环处理问题而生的 —— 面向不同数据类型，生成不同返回值的包含8个相关函数的函数族。
</i></center>
<h2 id="为何要用apply">为何要用apply？</h2>
<p>在使用 R 时，要尽量用 array 的方式思考，避免 for 循环，写过多的 for 循环代码，最后把 R 代码写的跟 C 似得说明你没有进入 R 的思考方式，是一种费力不讨好的行为。那么不用循环怎么实现迭代呢？apply函数族是一把利器，它不是一个函数，而是一族功能类似的函数。</p>
<br>
<hr>
<h2 id="语法详解">语法详解</h2>
<h3 id="apply">apply</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="nf">apply</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">margin</span><span class="p">,</span> <span class="n">FUN</span><span class="p">,</span> <span class="kc">...</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p><strong>参数列表：</strong>
X：数组、矩阵、数据框
margin：按维度运算，1表示按行，2表示按列，c(1,3)表示第1、3维
FUN：要使用的函数</p>
</blockquote>
<p>{% label info@<b>举例阐释</b> %}</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">mat</span> <span class="o">&lt;-</span> <span class="nf">matrix</span><span class="p">(</span><span class="m">1</span><span class="o">:</span><span class="m">12</span><span class="p">,</span> <span class="m">3</span><span class="p">,</span> <span class="m">4</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">mat</span>
</span></span><span class="line"><span class="cl">     <span class="n">[</span><span class="p">,</span><span class="m">1</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">2</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">3</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">4</span><span class="n">]</span>
</span></span><span class="line"><span class="cl"><span class="n">[1</span><span class="p">,</span><span class="n">]</span>    <span class="m">1</span>    <span class="m">4</span>    <span class="m">7</span>   <span class="m">10</span>
</span></span><span class="line"><span class="cl"><span class="n">[2</span><span class="p">,</span><span class="n">]</span>    <span class="m">2</span>    <span class="m">5</span>    <span class="m">8</span>   <span class="m">11</span>
</span></span><span class="line"><span class="cl"><span class="n">[3</span><span class="p">,</span><span class="n">]</span>    <span class="m">3</span>    <span class="m">6</span>    <span class="m">9</span>   <span class="m">12</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">apply</span><span class="p">(</span><span class="n">mat</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="n">sum</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span>  <span class="m">6</span> <span class="m">15</span> <span class="m">24</span> <span class="m">33</span>
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">ary</span> <span class="o">&lt;-</span> <span class="nf">array</span><span class="p">(</span><span class="m">1</span><span class="o">:</span><span class="m">12</span><span class="p">,</span> <span class="nf">c</span><span class="p">(</span><span class="m">2</span><span class="p">,</span><span class="m">3</span><span class="p">,</span><span class="m">2</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">ary</span>
</span></span><span class="line"><span class="cl"><span class="p">,</span> <span class="p">,</span> <span class="m">1</span>
</span></span><span class="line"><span class="cl">     <span class="n">[</span><span class="p">,</span><span class="m">1</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">2</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">3</span><span class="n">]</span>
</span></span><span class="line"><span class="cl"><span class="n">[1</span><span class="p">,</span><span class="n">]</span>    <span class="m">1</span>    <span class="m">3</span>    <span class="m">5</span>
</span></span><span class="line"><span class="cl"><span class="n">[2</span><span class="p">,</span><span class="n">]</span>    <span class="m">2</span>    <span class="m">4</span>    <span class="m">6</span>
</span></span><span class="line"><span class="cl"><span class="p">,</span> <span class="p">,</span> <span class="m">2</span>
</span></span><span class="line"><span class="cl">     <span class="n">[</span><span class="p">,</span><span class="m">1</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">2</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">3</span><span class="n">]</span>
</span></span><span class="line"><span class="cl"><span class="n">[1</span><span class="p">,</span><span class="n">]</span>    <span class="m">7</span>    <span class="m">9</span>   <span class="m">11</span>
</span></span><span class="line"><span class="cl"><span class="n">[2</span><span class="p">,</span><span class="n">]</span>    <span class="m">8</span>   <span class="m">10</span>   <span class="m">12</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">apply</span><span class="p">(</span><span class="n">ary</span><span class="p">,</span> <span class="nf">c</span><span class="p">(</span><span class="m">1</span><span class="p">,</span><span class="m">3</span><span class="p">),</span> <span class="n">sum</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">     <span class="n">[</span><span class="p">,</span><span class="m">1</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">2</span><span class="n">]</span>
</span></span><span class="line"><span class="cl"><span class="n">[1</span><span class="p">,</span><span class="n">]</span>    <span class="m">9</span>   <span class="m">27</span>
</span></span><span class="line"><span class="cl"><span class="n">[2</span><span class="p">,</span><span class="n">]</span>   <span class="m">12</span>   <span class="m">30</span>
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">data</span> <span class="o">&lt;-</span> <span class="nf">data.frame</span><span class="p">(</span><span class="n">x1</span><span class="o">=</span><span class="m">1</span><span class="o">:</span><span class="m">5</span><span class="p">,</span> <span class="n">x2</span><span class="o">=</span><span class="m">6</span><span class="o">:</span><span class="m">10</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">data</span>
</span></span><span class="line"><span class="cl">  <span class="n">x1</span> <span class="n">x2</span>
</span></span><span class="line"><span class="cl"><span class="m">1</span>  <span class="m">1</span>  <span class="m">6</span>
</span></span><span class="line"><span class="cl"><span class="m">2</span>  <span class="m">2</span>  <span class="m">7</span>
</span></span><span class="line"><span class="cl"><span class="m">3</span>  <span class="m">3</span>  <span class="m">8</span>
</span></span><span class="line"><span class="cl"><span class="m">4</span>  <span class="m">4</span>  <span class="m">9</span>
</span></span><span class="line"><span class="cl"><span class="m">5</span>  <span class="m">5</span> <span class="m">10</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">apply</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="n">mean</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">x1</span> <span class="n">x2</span> 
</span></span><span class="line"><span class="cl"> <span class="m">3</span>  <span class="m">8</span> 
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h3 id="tapply">tapply</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="nf">tapply</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">INDEX</span><span class="p">,</span> <span class="n">FUN</span> <span class="o">=</span> <span class="kc">NULL</span><span class="p">,</span> <span class="kc">...</span><span class="p">,</span> <span class="n">simplify</span> <span class="o">=</span> <span class="kc">TRUE</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p><strong>参数列表：</strong>
X：向量、数组
INDEX：用于分组的索引
FUN：要使用的函数
simplify : 是否数组化，当值TRUE时，输出结果按数组进行分组输出</p>
</blockquote>
<p>{% label info@<b>举例阐释</b> %}</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">x</span> <span class="o">&lt;-</span> <span class="m">1</span><span class="o">:</span><span class="m">6</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">INDEX</span> <span class="o">&lt;-</span> <span class="nf">c</span><span class="p">(</span><span class="s">&#39;a&#39;</span><span class="p">,</span><span class="s">&#39;a&#39;</span><span class="p">,</span><span class="s">&#39;b&#39;</span><span class="p">,</span><span class="s">&#39;c&#39;</span><span class="p">,</span><span class="s">&#39;c&#39;</span><span class="p">,</span><span class="s">&#39;c&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">tapply</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">INDEX</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">1</span> <span class="m">1</span> <span class="m">2</span> <span class="m">3</span> <span class="m">3</span> <span class="m">3</span>
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">tapply</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">INDEX</span><span class="p">,</span> <span class="n">sum</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">a</span>  <span class="n">b</span>  <span class="n">c</span> 
</span></span><span class="line"><span class="cl"> <span class="m">3</span>  <span class="m">3</span> <span class="m">15</span> 
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">mat</span> <span class="o">&lt;-</span> <span class="nf">matrix</span><span class="p">(</span><span class="m">1</span><span class="o">:</span><span class="m">10</span><span class="p">,</span> <span class="m">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">mat</span>
</span></span><span class="line"><span class="cl">     <span class="n">[</span><span class="p">,</span><span class="m">1</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">2</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">3</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">4</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">5</span><span class="n">]</span>
</span></span><span class="line"><span class="cl"><span class="n">[1</span><span class="p">,</span><span class="n">]</span>    <span class="m">1</span>    <span class="m">3</span>    <span class="m">5</span>    <span class="m">7</span>    <span class="m">9</span>
</span></span><span class="line"><span class="cl"><span class="n">[2</span><span class="p">,</span><span class="n">]</span>    <span class="m">2</span>    <span class="m">4</span>    <span class="m">6</span>    <span class="m">8</span>   <span class="m">10</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">INDEX</span> <span class="o">&lt;-</span> <span class="nf">matrix</span><span class="p">(</span><span class="nf">c</span><span class="p">(</span><span class="nf">rep</span><span class="p">(</span><span class="m">1</span><span class="p">,</span><span class="m">5</span><span class="p">),</span> <span class="nf">rep</span><span class="p">(</span><span class="m">2</span><span class="p">,</span><span class="m">5</span><span class="p">)),</span> <span class="n">nrow</span><span class="o">=</span><span class="m">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">INDEX</span>
</span></span><span class="line"><span class="cl">     <span class="n">[</span><span class="p">,</span><span class="m">1</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">2</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">3</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">4</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">5</span><span class="n">]</span>
</span></span><span class="line"><span class="cl"><span class="n">[1</span><span class="p">,</span><span class="n">]</span>    <span class="m">1</span>    <span class="m">1</span>    <span class="m">1</span>    <span class="m">2</span>    <span class="m">2</span>
</span></span><span class="line"><span class="cl"><span class="n">[2</span><span class="p">,</span><span class="n">]</span>    <span class="m">1</span>    <span class="m">1</span>    <span class="m">2</span>    <span class="m">2</span>    <span class="m">2</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">tapply</span><span class="p">(</span><span class="n">mat</span><span class="p">,</span> <span class="n">INDEX</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">[1]</span> <span class="m">1</span> <span class="m">1</span> <span class="m">1</span> <span class="m">1</span> <span class="m">1</span> <span class="m">2</span> <span class="m">2</span> <span class="m">2</span> <span class="m">2</span> <span class="m">2</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">tapply</span><span class="p">(</span><span class="n">mat</span><span class="p">,</span> <span class="n">INDEX</span><span class="p">,</span> <span class="n">mean</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="m">1</span> <span class="m">2</span> 
</span></span><span class="line"><span class="cl"><span class="m">3</span> <span class="m">8</span> 
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h3 id="lapply">lapply</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="nf">lapply</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">FUN</span><span class="p">,</span> <span class="kc">...</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p><strong>参数列表：</strong>
X：列表、向量、数据框
FUN：要使用的函数</p>
</blockquote>
<p>{% label info@<b>举例阐释</b> %}</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">lst</span> <span class="o">&lt;-</span> <span class="nf">list</span><span class="p">(</span><span class="n">a</span><span class="o">=</span><span class="m">1</span><span class="o">:</span><span class="m">10</span><span class="p">,</span> <span class="n">b</span><span class="o">=</span><span class="nf">seq</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="m">7</span><span class="p">,</span><span class="m">2</span><span class="p">),</span> <span class="n">c</span><span class="o">=</span><span class="nf">c</span><span class="p">(</span><span class="m">2</span><span class="p">,</span><span class="m">5</span><span class="p">,</span><span class="m">8</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">lst</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">a</span>
</span></span><span class="line"><span class="cl"> <span class="n">[1]</span>  <span class="m">1</span>  <span class="m">2</span>  <span class="m">3</span>  <span class="m">4</span>  <span class="m">5</span>  <span class="m">6</span>  <span class="m">7</span>  <span class="m">8</span>  <span class="m">9</span> <span class="m">10</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">b</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">0</span> <span class="m">2</span> <span class="m">4</span> <span class="m">6</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">c</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">2</span> <span class="m">5</span> <span class="m">8</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">lapply</span><span class="p">(</span><span class="n">lst</span><span class="p">,</span> <span class="n">mean</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">a</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">5.5</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">b</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">3</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">c</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">5</span>
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">data</span> <span class="o">&lt;-</span> <span class="nf">data.frame</span><span class="p">(</span><span class="n">x1</span><span class="o">=</span><span class="m">1</span><span class="o">:</span><span class="m">5</span><span class="p">,</span> <span class="n">x2</span><span class="o">=</span><span class="m">6</span><span class="o">:</span><span class="m">10</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">data</span>
</span></span><span class="line"><span class="cl">  <span class="n">x1</span> <span class="n">x2</span>
</span></span><span class="line"><span class="cl"><span class="m">1</span>  <span class="m">1</span>  <span class="m">6</span>
</span></span><span class="line"><span class="cl"><span class="m">2</span>  <span class="m">2</span>  <span class="m">7</span>
</span></span><span class="line"><span class="cl"><span class="m">3</span>  <span class="m">3</span>  <span class="m">8</span>
</span></span><span class="line"><span class="cl"><span class="m">4</span>  <span class="m">4</span>  <span class="m">9</span>
</span></span><span class="line"><span class="cl"><span class="m">5</span>  <span class="m">5</span> <span class="m">10</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">lapply</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">sum</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">x1</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">15</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">x2</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">40</span>
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">isLeapYear</span> <span class="o">&lt;-</span> <span class="kr">function</span><span class="p">(</span><span class="n">a</span><span class="p">){</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>   <span class="kr">if</span><span class="p">(</span> <span class="p">(</span><span class="n">a</span><span class="o">%%</span><span class="m">4</span><span class="o">==</span><span class="m">0</span> <span class="o">&amp;</span> <span class="n">a</span><span class="o">%/%</span><span class="m">100</span><span class="o">!=</span><span class="m">0</span><span class="p">)</span> <span class="o">|</span> <span class="n">a</span><span class="o">%%</span><span class="m">400</span><span class="o">==</span><span class="m">0</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>     <span class="n">a</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">a</span> <span class="o">&lt;-</span> <span class="m">1900</span><span class="o">:</span><span class="m">1910</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">unlist</span><span class="p">(</span><span class="nf">lapply</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">isLeapYear</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">1900</span> <span class="m">1904</span> <span class="m">1908</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h3 id="rapply">rapply</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="nf">rapply</span><span class="p">(</span><span class="n">list</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">classes</span> <span class="o">=</span> <span class="s">&#34;ANY&#34;</span><span class="p">,</span> <span class="n">deflt</span> <span class="o">=</span> <span class="kc">NULL</span><span class="p">,</span><span class="n">how</span> <span class="o">=</span> <span class="nf">c</span><span class="p">(</span><span class="s">&#34;unlist&#34;</span><span class="p">,</span> <span class="s">&#34;replace&#34;</span><span class="p">,</span> <span class="s">&#34;list&#34;</span><span class="p">),</span> <span class="kc">...</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p><strong>参数列表：</strong>
list：列表
f：要使用的函数
classes： 匹配类型, ANY为所有类型
deflt: 非匹配类型的默认值
how: 3种操作方式，</p>
<ul>
<li>replace：则用调用f后的结果替换原list中原来的元素；</li>
<li>list：新建一个list，类型匹配调用f函数，不匹配赋值为deflt；</li>
<li>unlist：执行一次unlist(recursive = TRUE)操作</li>
</ul>
</blockquote>
<p>{% label info@<b>举例阐释</b> %}</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">lst</span> <span class="o">&lt;-</span> <span class="nf">list</span><span class="p">(</span><span class="n">a</span><span class="o">=</span><span class="nf">list</span><span class="p">(</span><span class="n">aa</span><span class="o">=</span><span class="nf">c</span><span class="p">(</span><span class="m">1</span><span class="o">:</span><span class="m">5</span><span class="p">),</span> <span class="n">ab</span><span class="o">=</span><span class="nf">c</span><span class="p">(</span><span class="m">6</span><span class="o">:</span><span class="m">10</span><span class="p">)),</span> <span class="n">b</span><span class="o">=</span><span class="nf">list</span><span class="p">(</span><span class="n">ba</span><span class="o">=</span><span class="nf">c</span><span class="p">(</span><span class="m">1</span><span class="o">:</span><span class="m">10</span><span class="p">)))</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">lst</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">a</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">a</span><span class="o">$</span><span class="n">aa</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">1</span> <span class="m">2</span> <span class="m">3</span> <span class="m">4</span> <span class="m">5</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">a</span><span class="o">$</span><span class="n">ab</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span>  <span class="m">6</span>  <span class="m">7</span>  <span class="m">8</span>  <span class="m">9</span> <span class="m">10</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">b</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">b</span><span class="o">$</span><span class="n">ba</span>
</span></span><span class="line"><span class="cl"> <span class="n">[1]</span>  <span class="m">1</span>  <span class="m">2</span>  <span class="m">3</span>  <span class="m">4</span>  <span class="m">5</span>  <span class="m">6</span>  <span class="m">7</span>  <span class="m">8</span>  <span class="m">9</span> <span class="m">10</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">rapply</span><span class="p">(</span><span class="n">lst</span><span class="p">,</span> <span class="n">sum</span><span class="p">,</span> <span class="n">how</span><span class="o">=</span><span class="s">&#34;replace&#34;</span><span class="p">)</span>  <span class="c1"># 输出结果为list</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">a</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">a</span><span class="o">$</span><span class="n">aa</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">15</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">a</span><span class="o">$</span><span class="n">ab</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">40</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">b</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">b</span><span class="o">$</span><span class="n">ba</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">55</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">rapply</span><span class="p">(</span><span class="n">lst</span><span class="p">,</span> <span class="n">sum</span><span class="p">,</span> <span class="n">how</span><span class="o">=</span><span class="s">&#34;unlist&#34;</span><span class="p">)</span>   <span class="c1"># 输出结果为vector</span>
</span></span><span class="line"><span class="cl"><span class="n">a.aa</span> <span class="n">a.ab</span> <span class="n">b.ba</span> 
</span></span><span class="line"><span class="cl">  <span class="m">15</span>   <span class="m">40</span>   <span class="m">55</span> 
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h3 id="sapply">sapply</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="nf">sapply</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">FUN</span><span class="p">,</span> <span class="kc">...</span><span class="p">,</span> <span class="n">simplify</span> <span class="o">=</span> <span class="kc">TRUE</span><span class="p">,</span> <span class="n">USE.NAMES</span> <span class="o">=</span> <span class="kc">TRUE</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p><strong>参数列表：</strong>
X：列表、向量、数据框
FUN：要使用的函数
simplify: 若FALSE，等价于lapply。否则，将lapply输出的list简化为vector或matrix
USE.NAMES: 如果X为字符串，TRUE设置字符串为数据名，FALSE不设置</p>
</blockquote>
<p>{% label info@<b>举例阐释</b> %}</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">lst</span> <span class="o">&lt;-</span> <span class="nf">list</span><span class="p">(</span><span class="n">a</span><span class="o">=</span><span class="nf">c</span><span class="p">(</span><span class="m">1</span><span class="o">:</span><span class="m">5</span><span class="p">),</span> <span class="n">b</span><span class="o">=</span><span class="nf">c</span><span class="p">(</span><span class="m">6</span><span class="o">:</span><span class="m">10</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">sapply</span><span class="p">(</span><span class="n">lst</span><span class="p">,</span> <span class="n">sum</span><span class="p">,</span> <span class="n">simplify</span> <span class="o">=</span> <span class="bp">F</span><span class="p">)</span>    <span class="c1"># 输出list</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">a</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">15</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">b</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">40</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">sapply</span><span class="p">(</span><span class="n">lst</span><span class="p">,</span> <span class="n">sum</span><span class="p">)</span>                  <span class="c1"># 输出vector</span>
</span></span><span class="line"><span class="cl"> <span class="n">a</span>  <span class="n">b</span> 
</span></span><span class="line"><span class="cl"><span class="m">15</span> <span class="m">40</span> 
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">sapply</span><span class="p">(</span><span class="n">lst</span><span class="p">,</span> <span class="n">fivenum</span><span class="p">)</span>              <span class="c1"># 输出matrix</span>
</span></span><span class="line"><span class="cl">     <span class="n">a</span>  <span class="n">b</span>
</span></span><span class="line"><span class="cl"><span class="n">[1</span><span class="p">,</span><span class="n">]</span> <span class="m">1</span>  <span class="m">6</span>
</span></span><span class="line"><span class="cl"><span class="n">[2</span><span class="p">,</span><span class="n">]</span> <span class="m">2</span>  <span class="m">7</span>
</span></span><span class="line"><span class="cl"><span class="n">[3</span><span class="p">,</span><span class="n">]</span> <span class="m">3</span>  <span class="m">8</span>
</span></span><span class="line"><span class="cl"><span class="n">[4</span><span class="p">,</span><span class="n">]</span> <span class="m">4</span>  <span class="m">9</span>
</span></span><span class="line"><span class="cl"><span class="n">[5</span><span class="p">,</span><span class="n">]</span> <span class="m">5</span> <span class="m">10</span>
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">val</span> <span class="o">&lt;-</span> <span class="nf">head</span><span class="p">(</span><span class="kc">letters</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">val</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="s">&#34;a&#34;</span> <span class="s">&#34;b&#34;</span> <span class="s">&#34;c&#34;</span> <span class="s">&#34;d&#34;</span> <span class="s">&#34;e&#34;</span> <span class="s">&#34;f&#34;</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">sapply</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">paste</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="n">a</span>   <span class="n">b</span>   <span class="n">c</span>   <span class="n">d</span>   <span class="n">e</span>   <span class="n">f</span> 
</span></span><span class="line"><span class="cl"><span class="s">&#34;a&#34;</span> <span class="s">&#34;b&#34;</span> <span class="s">&#34;c&#34;</span> <span class="s">&#34;d&#34;</span> <span class="s">&#34;e&#34;</span> <span class="s">&#34;f&#34;</span> 
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">sapply</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">paste</span><span class="p">,</span> <span class="n">USE.NAMES</span> <span class="o">=</span> <span class="bp">F</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="s">&#34;a&#34;</span> <span class="s">&#34;b&#34;</span> <span class="s">&#34;c&#34;</span> <span class="s">&#34;d&#34;</span> <span class="s">&#34;e&#34;</span> <span class="s">&#34;f&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h3 id="vapply">vapply</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="nf">vapply</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">FUN</span><span class="p">,</span> <span class="n">FUN.VALUE</span><span class="p">,</span> <span class="kc">...</span><span class="p">,</span> <span class="n">USE.NAMES</span> <span class="o">=</span> <span class="kc">TRUE</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p><strong>参数列表：</strong>
X：列表、数据框
FUN：要使用的函数
FUN.VALUE：定义返回值的行名row.names
USE.NAMES: 如果X为字符串，TRUE设置字符串为数据名，FALSE不设置</p>
</blockquote>
<p>{% label info@<b>举例阐释</b> %}</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">lst</span> <span class="o">&lt;-</span> <span class="nf">list</span><span class="p">(</span><span class="n">a</span><span class="o">=</span><span class="nf">c</span><span class="p">(</span><span class="m">1</span><span class="o">:</span><span class="m">5</span><span class="p">),</span> <span class="n">b</span><span class="o">=</span><span class="nf">c</span><span class="p">(</span><span class="m">6</span><span class="o">:</span><span class="m">10</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">res</span> <span class="o">&lt;-</span> <span class="nf">vapply</span><span class="p">(</span><span class="n">lst</span><span class="p">,</span> <span class="kr">function</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="nf">c</span><span class="p">(</span><span class="nf">min</span><span class="p">(</span><span class="n">x</span><span class="p">),</span> <span class="nf">max</span><span class="p">(</span><span class="n">x</span><span class="p">)),</span> <span class="nf">c</span><span class="p">(</span><span class="n">min.</span><span class="o">=</span><span class="m">0</span><span class="p">,</span> <span class="n">max.</span><span class="o">=</span><span class="m">0</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">res</span>
</span></span><span class="line"><span class="cl">     <span class="n">a</span>  <span class="n">b</span>
</span></span><span class="line"><span class="cl"><span class="n">min.</span> <span class="m">1</span>  <span class="m">6</span>
</span></span><span class="line"><span class="cl"><span class="n">max.</span> <span class="m">5</span> <span class="m">10</span>
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">data</span> <span class="o">&lt;-</span> <span class="nf">data.frame</span><span class="p">(</span><span class="nf">cbind</span><span class="p">(</span><span class="n">x1</span><span class="o">=</span><span class="m">3</span><span class="p">,</span> <span class="n">x2</span><span class="o">=</span><span class="nf">c</span><span class="p">(</span><span class="m">2</span><span class="o">:</span><span class="m">1</span><span class="p">,</span><span class="m">4</span><span class="o">:</span><span class="m">5</span><span class="p">)))</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">data</span>
</span></span><span class="line"><span class="cl">  <span class="n">x1</span> <span class="n">x2</span>
</span></span><span class="line"><span class="cl"><span class="m">1</span>  <span class="m">3</span>  <span class="m">2</span>
</span></span><span class="line"><span class="cl"><span class="m">2</span>  <span class="m">3</span>  <span class="m">1</span>
</span></span><span class="line"><span class="cl"><span class="m">3</span>  <span class="m">3</span>  <span class="m">4</span>
</span></span><span class="line"><span class="cl"><span class="m">4</span>  <span class="m">3</span>  <span class="m">5</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">vapply</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">cumsum</span><span class="p">,</span> <span class="n">FUN.VALUE</span><span class="o">=</span><span class="nf">c</span><span class="p">(</span><span class="s">&#39;a&#39;</span><span class="o">=</span><span class="m">0</span><span class="p">,</span><span class="s">&#39;b&#39;</span><span class="o">=</span><span class="m">0</span><span class="p">,</span><span class="s">&#39;c&#39;</span><span class="o">=</span><span class="m">0</span><span class="p">,</span><span class="s">&#39;d&#39;</span><span class="o">=</span><span class="m">0</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">  <span class="n">x1</span> <span class="n">x2</span>
</span></span><span class="line"><span class="cl"><span class="n">a</span>  <span class="m">3</span>  <span class="m">2</span>
</span></span><span class="line"><span class="cl"><span class="n">b</span>  <span class="m">6</span>  <span class="m">3</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span>  <span class="m">9</span>  <span class="m">7</span>
</span></span><span class="line"><span class="cl"><span class="n">d</span> <span class="m">12</span> <span class="m">12</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h3 id="mapply">mapply</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="nf">mapply</span><span class="p">(</span><span class="n">FUN</span><span class="p">,</span> <span class="kc">...</span><span class="p">,</span> <span class="n">MoreArgs</span><span class="o">=</span><span class="kc">NULL</span><span class="p">,</span> <span class="n">SIMPLIFY</span><span class="o">=</span><span class="kc">TRUE</span><span class="p">,</span> <span class="n">USE.NAMES</span><span class="o">=</span><span class="kc">TRUE</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p><strong>参数列表：</strong>
FUN：要使用的函数
…: 接收多个数据(list、vector)
MoreArgs: FUN的参数列表
simplify: 若FALSE，输出list。否则，将输出的list简化为vector或matrix
USE.NAMES: 如果X为字符串，TRUE设置字符串为数据名，FALSE不设置</p>
</blockquote>
<p>{% label info@<b>举例阐释</b> %}</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">mapply</span><span class="p">(</span><span class="n">sum</span><span class="p">,</span> <span class="nf">list</span><span class="p">(</span><span class="n">a</span><span class="o">=</span><span class="m">1</span><span class="p">,</span><span class="n">b</span><span class="o">=</span><span class="m">2</span><span class="p">,</span><span class="n">c</span><span class="o">=</span><span class="m">3</span><span class="p">),</span> <span class="nf">list</span><span class="p">(</span><span class="n">a</span><span class="o">=</span><span class="m">10</span><span class="p">,</span><span class="n">b</span><span class="o">=</span><span class="m">20</span><span class="p">,</span><span class="n">d</span><span class="o">=</span><span class="m">30</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"> <span class="n">a</span>  <span class="n">b</span>  <span class="n">c</span> 
</span></span><span class="line"><span class="cl"><span class="m">11</span> <span class="m">22</span> <span class="m">33</span> 
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">a</span> <span class="o">&lt;-</span> <span class="m">1</span><span class="o">:</span><span class="m">10</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">b</span> <span class="o">&lt;-</span> <span class="m">5</span><span class="o">:</span><span class="m">-4</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">a</span>
</span></span><span class="line"><span class="cl"> <span class="n">[1]</span>  <span class="m">1</span>  <span class="m">2</span>  <span class="m">3</span>  <span class="m">4</span>  <span class="m">5</span>  <span class="m">6</span>  <span class="m">7</span>  <span class="m">8</span>  <span class="m">9</span> <span class="m">10</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">b</span>
</span></span><span class="line"><span class="cl"> <span class="n">[1]</span>  <span class="m">5</span>  <span class="m">4</span>  <span class="m">3</span>  <span class="m">2</span>  <span class="m">1</span>  <span class="m">0</span> <span class="m">-1</span> <span class="m">-2</span> <span class="m">-3</span> <span class="m">-4</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">mapply</span><span class="p">(</span><span class="n">max</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">[1]</span>  <span class="m">5</span>  <span class="m">4</span>  <span class="m">3</span>  <span class="m">4</span>  <span class="m">5</span>  <span class="m">6</span>  <span class="m">7</span>  <span class="m">8</span>  <span class="m">9</span> <span class="m">10</span>
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">mapply</span><span class="p">(</span><span class="kr">function</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">)</span> <span class="nf">c</span><span class="p">(</span><span class="n">x</span><span class="o">+</span><span class="n">y</span><span class="p">,</span> <span class="n">x^y</span><span class="p">,</span> <span class="n">x</span><span class="o">-</span><span class="n">y</span><span class="p">),</span> <span class="nf">c</span><span class="p">(</span><span class="m">1</span><span class="o">:</span><span class="m">5</span><span class="p">),</span> <span class="nf">c</span><span class="p">(</span><span class="m">1</span><span class="o">:</span><span class="m">5</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">     <span class="n">[</span><span class="p">,</span><span class="m">1</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">2</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">3</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">4</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">5</span><span class="n">]</span>
</span></span><span class="line"><span class="cl"><span class="n">[1</span><span class="p">,</span><span class="n">]</span>    <span class="m">2</span>    <span class="m">4</span>    <span class="m">6</span>    <span class="m">8</span>   <span class="m">10</span>
</span></span><span class="line"><span class="cl"><span class="n">[2</span><span class="p">,</span><span class="n">]</span>    <span class="m">1</span>    <span class="m">4</span>   <span class="m">27</span>  <span class="m">256</span> <span class="m">3125</span>
</span></span><span class="line"><span class="cl"><span class="n">[3</span><span class="p">,</span><span class="n">]</span>    <span class="m">0</span>    <span class="m">0</span>    <span class="m">0</span>    <span class="m">0</span>    <span class="m">0</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h3 id="eapply">eapply</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="nf">eapply</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="n">FUN</span><span class="p">,</span> <span class="kc">...</span><span class="p">,</span> <span class="n">all.names</span> <span class="o">=</span> <span class="kc">FALSE</span><span class="p">,</span> <span class="n">USE.NAMES</span> <span class="o">=</span> <span class="kc">TRUE</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p><strong>参数列表：</strong>
env: 环境空间
FUN：要使用的函数
all.names: 匹配类型, ANY为所有类型
USE.NAMES: 如果X为字符串，TRUE设置字符串为数据名，FALSE不设置</p>
</blockquote>
<p>{% label info@<b>举例阐释</b> %}</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="c1"># 定义一个环境空间</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">env</span> <span class="o">&lt;-</span> <span class="nf">new.env</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="c1"># 向这个环境空间中存入3个变量</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">env</span><span class="o">$</span><span class="n">a</span> <span class="o">&lt;-</span> <span class="m">1</span><span class="o">:</span><span class="m">10</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">env</span><span class="o">$</span><span class="n">b</span> <span class="o">&lt;-</span> <span class="nf">exp</span><span class="p">(</span><span class="m">-3</span><span class="o">:</span><span class="m">3</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">env</span><span class="o">$</span><span class="n">logic</span> <span class="o">&lt;-</span> <span class="nf">c</span><span class="p">(</span><span class="kc">TRUE</span><span class="p">,</span> <span class="kc">FALSE</span><span class="p">,</span> <span class="kc">FALSE</span><span class="p">,</span> <span class="kc">TRUE</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">ls</span><span class="p">(</span><span class="n">env</span><span class="p">)</span>      <span class="c1"># 查看env空间中的变量</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="s">&#34;a&#34;</span>     <span class="s">&#34;b&#34;</span>     <span class="s">&#34;logic&#34;</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">ls.str</span><span class="p">(</span><span class="n">env</span><span class="p">)</span>  <span class="c1"># 查看env空间中的变量字符串结构</span>
</span></span><span class="line"><span class="cl"><span class="n">a</span> <span class="o">:</span>  <span class="n">int</span> <span class="n">[1</span><span class="o">:</span><span class="m">10</span><span class="n">]</span> <span class="m">1</span> <span class="m">2</span> <span class="m">3</span> <span class="m">4</span> <span class="m">5</span> <span class="m">6</span> <span class="m">7</span> <span class="m">8</span> <span class="m">9</span> <span class="m">10</span>
</span></span><span class="line"><span class="cl"><span class="n">b</span> <span class="o">:</span>  <span class="n">num</span> <span class="n">[1</span><span class="o">:</span><span class="m">7</span><span class="n">]</span> <span class="m">0.0498</span> <span class="m">0.1353</span> <span class="m">0.3679</span> <span class="m">1</span> <span class="m">2.7183</span> <span class="kc">...</span>
</span></span><span class="line"><span class="cl"><span class="n">logic</span> <span class="o">:</span>  <span class="n">logi</span> <span class="n">[1</span><span class="o">:</span><span class="m">4</span><span class="n">]</span> <span class="kc">TRUE</span> <span class="kc">FALSE</span> <span class="kc">FALSE</span> <span class="kc">TRUE</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">eapply</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="n">mean</span><span class="p">)</span>   <span class="c1"># 计算env环境空间中所有变量的均值</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">a</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">5.5</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">b</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">4.535125</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">logic</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">0.5</span>
</span></span></code></pre></td></tr></table>
</div>
</div><br>
<hr>
<h2 id="应用及拓展">应用及拓展</h2>
<h3 id="应用展示">应用展示</h3>
<p>原始数据为按年份year、地区loc和商品类别type进行统计的销售量。我们要制作两个销售总量的crosstable，一个以年份为行、地区为列，一个以年份为行，类别为列。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">df</span> <span class="o">&lt;-</span> <span class="nf">data.frame</span><span class="p">(</span><span class="n">year</span><span class="o">=</span><span class="nf">kronecker</span><span class="p">(</span><span class="m">2001</span><span class="o">:</span><span class="m">2003</span><span class="p">,</span> <span class="nf">rep</span><span class="p">(</span><span class="m">1</span><span class="p">,</span><span class="m">4</span><span class="p">)),</span> 
</span></span><span class="line"><span class="cl">                 <span class="n">loc</span><span class="o">=</span><span class="nf">c</span><span class="p">(</span><span class="s">&#39;beijing&#39;</span><span class="p">,</span><span class="s">&#39;beijing&#39;</span><span class="p">,</span><span class="s">&#39;shanghai&#39;</span><span class="p">,</span><span class="s">&#39;shanghai&#39;</span><span class="p">),</span> 
</span></span><span class="line"><span class="cl">                 <span class="n">type</span><span class="o">=</span><span class="nf">rep</span><span class="p">(</span><span class="nf">c</span><span class="p">(</span><span class="s">&#39;A&#39;</span><span class="p">,</span><span class="s">&#39;B&#39;</span><span class="p">),</span><span class="m">6</span><span class="p">),</span> <span class="n">sale</span><span class="o">=</span><span class="nf">rep</span><span class="p">(</span><span class="m">1</span><span class="o">:</span><span class="m">12</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">df</span>
</span></span><span class="line"><span class="cl">   <span class="n">year</span>      <span class="n">loc</span> <span class="n">type</span> <span class="n">sale</span>
</span></span><span class="line"><span class="cl"><span class="m">1</span>  <span class="m">2001</span>  <span class="n">beijing</span>    <span class="n">A</span>    <span class="m">1</span>
</span></span><span class="line"><span class="cl"><span class="m">2</span>  <span class="m">2001</span>  <span class="n">beijing</span>    <span class="n">B</span>    <span class="m">2</span>
</span></span><span class="line"><span class="cl"><span class="m">3</span>  <span class="m">2001</span> <span class="n">shanghai</span>    <span class="n">A</span>    <span class="m">3</span>
</span></span><span class="line"><span class="cl"><span class="m">4</span>  <span class="m">2001</span> <span class="n">shanghai</span>    <span class="n">B</span>    <span class="m">4</span>
</span></span><span class="line"><span class="cl"><span class="m">5</span>  <span class="m">2002</span>  <span class="n">beijing</span>    <span class="n">A</span>    <span class="m">5</span>
</span></span><span class="line"><span class="cl"><span class="m">6</span>  <span class="m">2002</span>  <span class="n">beijing</span>    <span class="n">B</span>    <span class="m">6</span>
</span></span><span class="line"><span class="cl"><span class="m">7</span>  <span class="m">2002</span> <span class="n">shanghai</span>    <span class="n">A</span>    <span class="m">7</span>
</span></span><span class="line"><span class="cl"><span class="m">8</span>  <span class="m">2002</span> <span class="n">shanghai</span>    <span class="n">B</span>    <span class="m">8</span>
</span></span><span class="line"><span class="cl"><span class="m">9</span>  <span class="m">2003</span>  <span class="n">beijing</span>    <span class="n">A</span>    <span class="m">9</span>
</span></span><span class="line"><span class="cl"><span class="m">10</span> <span class="m">2003</span>  <span class="n">beijing</span>    <span class="n">B</span>   <span class="m">10</span>
</span></span><span class="line"><span class="cl"><span class="m">11</span> <span class="m">2003</span> <span class="n">shanghai</span>    <span class="n">A</span>   <span class="m">11</span>
</span></span><span class="line"><span class="cl"><span class="m">12</span> <span class="m">2003</span> <span class="n">shanghai</span>    <span class="n">B</span>   <span class="m">12</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">tapply</span><span class="p">(</span><span class="n">df</span><span class="o">$</span><span class="n">sale</span><span class="p">,</span> <span class="n">df[</span><span class="p">,</span><span class="nf">c</span><span class="p">(</span><span class="s">&#39;year&#39;</span><span class="p">,</span><span class="s">&#39;loc&#39;</span><span class="p">)</span><span class="n">]</span><span class="p">,</span> <span class="n">sum</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">      <span class="n">loc</span>
</span></span><span class="line"><span class="cl"><span class="n">year</span>   <span class="n">beijing</span> <span class="n">shanghai</span>
</span></span><span class="line"><span class="cl">  <span class="m">2001</span>       <span class="m">3</span>        <span class="m">7</span>
</span></span><span class="line"><span class="cl">  <span class="m">2002</span>      <span class="m">11</span>       <span class="m">15</span>
</span></span><span class="line"><span class="cl">  <span class="m">2003</span>      <span class="m">19</span>       <span class="m">23</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">tapply</span><span class="p">(</span><span class="n">df</span><span class="o">$</span><span class="n">sale</span><span class="p">,</span> <span class="n">df[</span><span class="p">,</span><span class="nf">c</span><span class="p">(</span><span class="s">&#39;year&#39;</span><span class="p">,</span><span class="s">&#39;type&#39;</span><span class="p">)</span><span class="n">]</span><span class="p">,</span> <span class="n">sum</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">      <span class="n">type</span>
</span></span><span class="line"><span class="cl"><span class="n">year</span>    <span class="n">A</span>  <span class="n">B</span>
</span></span><span class="line"><span class="cl">  <span class="m">2001</span>  <span class="m">4</span>  <span class="m">6</span>
</span></span><span class="line"><span class="cl">  <span class="m">2002</span> <span class="m">12</span> <span class="m">14</span>
</span></span><span class="line"><span class="cl">  <span class="m">2003</span> <span class="m">20</span> <span class="m">22</span>
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">list1</span> <span class="o">&lt;-</span> <span class="nf">list</span><span class="p">(</span><span class="n">a</span><span class="o">=</span><span class="m">1</span><span class="o">:</span><span class="m">5</span><span class="p">,</span> <span class="n">b</span><span class="o">=</span><span class="nf">list</span><span class="p">(</span><span class="n">c</span><span class="o">=</span><span class="m">1</span><span class="o">:</span><span class="m">4</span><span class="p">,</span> <span class="n">d</span><span class="o">=</span><span class="m">5</span><span class="o">:</span><span class="m">9</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">list1</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">a</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">1</span> <span class="m">2</span> <span class="m">3</span> <span class="m">4</span> <span class="m">5</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">b</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">b</span><span class="o">$</span><span class="n">c</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">1</span> <span class="m">2</span> <span class="m">3</span> <span class="m">4</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">b</span><span class="o">$</span><span class="n">d</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">5</span> <span class="m">6</span> <span class="m">7</span> <span class="m">8</span> <span class="m">9</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">list2</span> <span class="o">&lt;-</span> <span class="nf">list</span><span class="p">(</span><span class="n">a</span><span class="o">=</span><span class="m">1</span><span class="o">:</span><span class="m">5</span><span class="p">,</span> <span class="n">b</span><span class="o">=</span><span class="nf">list</span><span class="p">(</span><span class="n">c</span><span class="o">=</span><span class="m">5</span><span class="o">:</span><span class="m">8</span><span class="p">,</span> <span class="n">d</span><span class="o">=</span><span class="m">1</span><span class="o">:</span><span class="m">5</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">list2</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">a</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">1</span> <span class="m">2</span> <span class="m">3</span> <span class="m">4</span> <span class="m">5</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">b</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">b</span><span class="o">$</span><span class="n">c</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">5</span> <span class="m">6</span> <span class="m">7</span> <span class="m">8</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">b</span><span class="o">$</span><span class="n">d</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">1</span> <span class="m">2</span> <span class="m">3</span> <span class="m">4</span> <span class="m">5</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="s">&#34;%+%&#34;</span> <span class="o">&lt;-</span> <span class="kr">function</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">)</span> <span class="nf">mapply</span><span class="p">(</span><span class="s">&#34;+&#34;</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">mapply</span><span class="p">(</span><span class="s">&#34;%+%&#34;</span><span class="p">,</span> <span class="n">list1</span><span class="p">,</span> <span class="n">list2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">a</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span>  <span class="m">2</span>  <span class="m">4</span>  <span class="m">6</span>  <span class="m">8</span> <span class="m">10</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">b</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">b</span><span class="o">$</span><span class="n">c</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span>  <span class="m">6</span>  <span class="m">8</span> <span class="m">10</span> <span class="m">12</span>
</span></span><span class="line"><span class="cl"><span class="o">$</span><span class="n">b</span><span class="o">$</span><span class="n">d</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span>  <span class="m">6</span>  <span class="m">8</span> <span class="m">10</span> <span class="m">12</span> <span class="m">14</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h3 id="相关函数">相关函数</h3>
<h4 id="by">by</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="nf">by</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">INDICES</span><span class="p">,</span> <span class="n">FUN</span><span class="p">,</span> <span class="kc">...</span><span class="p">,</span> <span class="n">simplify</span> <span class="o">=</span> <span class="kc">TRUE</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p><strong>参数列表：</strong>
data: 数据框
INDICES：与数据框行数等长的用于分组的索引
FUN：要使用的函数</p>
</blockquote>
<p>{% label info@<b>举例阐释</b> %}</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">data</span> <span class="o">&lt;-</span> <span class="nf">data.frame</span><span class="p">(</span><span class="n">a</span><span class="o">=</span><span class="nf">c</span><span class="p">(</span><span class="m">1</span><span class="o">:</span><span class="m">5</span><span class="p">),</span> <span class="n">b</span><span class="o">=</span><span class="nf">c</span><span class="p">(</span><span class="m">6</span><span class="o">:</span><span class="m">10</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">data</span>
</span></span><span class="line"><span class="cl">  <span class="n">a</span>  <span class="n">b</span>
</span></span><span class="line"><span class="cl"><span class="m">1</span> <span class="m">1</span>  <span class="m">6</span>
</span></span><span class="line"><span class="cl"><span class="m">2</span> <span class="m">2</span>  <span class="m">7</span>
</span></span><span class="line"><span class="cl"><span class="m">3</span> <span class="m">3</span>  <span class="m">8</span>
</span></span><span class="line"><span class="cl"><span class="m">4</span> <span class="m">4</span>  <span class="m">9</span>
</span></span><span class="line"><span class="cl"><span class="m">5</span> <span class="m">5</span> <span class="m">10</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">INDICES</span> <span class="o">&lt;-</span> <span class="nf">c</span><span class="p">(</span><span class="m">1</span><span class="p">,</span><span class="m">1</span><span class="p">,</span><span class="m">2</span><span class="p">,</span><span class="m">2</span><span class="p">,</span><span class="m">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">by</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">INDICES</span><span class="p">,</span> <span class="n">colMeans</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">INDICES</span><span class="o">:</span> <span class="m">1</span>
</span></span><span class="line"><span class="cl">  <span class="n">a</span>   <span class="n">b</span> 
</span></span><span class="line"><span class="cl"><span class="m">1.5</span> <span class="m">6.5</span> 
</span></span><span class="line"><span class="cl"><span class="o">-------------------------------------------------------------------------------</span>
</span></span><span class="line"><span class="cl"><span class="n">INDICES</span><span class="o">:</span> <span class="m">2</span>
</span></span><span class="line"><span class="cl"><span class="n">a</span> <span class="n">b</span> 
</span></span><span class="line"><span class="cl"><span class="m">4</span> <span class="m">9</span> 
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">by</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">INDICES</span><span class="p">,</span> <span class="n">rowMeans</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">INDICES</span><span class="o">:</span> <span class="m">1</span>
</span></span><span class="line"><span class="cl">  <span class="m">1</span>   <span class="m">2</span> 
</span></span><span class="line"><span class="cl"><span class="m">3.5</span> <span class="m">4.5</span> 
</span></span><span class="line"><span class="cl"><span class="o">-------------------------------------------------------------------------------</span>
</span></span><span class="line"><span class="cl"><span class="n">INDICES</span><span class="o">:</span> <span class="m">2</span>
</span></span><span class="line"><span class="cl">  <span class="m">3</span>   <span class="m">4</span>   <span class="m">5</span> 
</span></span><span class="line"><span class="cl"><span class="m">5.5</span> <span class="m">6.5</span> <span class="m">7.5</span> 
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="outer">outer</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="nf">outer</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">Y</span><span class="p">,</span> <span class="n">FUN</span> <span class="o">=</span> <span class="s">&#34;*&#34;</span><span class="p">,</span> <span class="kc">...</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p><strong>参数列表：</strong>
X、Y: 向量、数组
FUN：当为空时即为外积运算，否则为将FUN代替外积运算符进行类似外积的运算操作</p>
</blockquote>
<p>{% label info@<b>举例阐释</b> %}</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">x</span> <span class="o">&lt;-</span> <span class="m">1</span><span class="o">:</span><span class="m">4</span><span class="p">;</span> <span class="n">y</span> <span class="o">&lt;-</span> <span class="m">2</span><span class="o">:</span><span class="m">4</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">x</span><span class="p">;</span> <span class="n">y</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">1</span> <span class="m">2</span> <span class="m">3</span> <span class="m">4</span>
</span></span><span class="line"><span class="cl"><span class="n">[1]</span> <span class="m">2</span> <span class="m">3</span> <span class="m">4</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">outer</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">     <span class="n">[</span><span class="p">,</span><span class="m">1</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">2</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">3</span><span class="n">]</span>
</span></span><span class="line"><span class="cl"><span class="n">[1</span><span class="p">,</span><span class="n">]</span>    <span class="m">2</span>    <span class="m">3</span>    <span class="m">4</span>
</span></span><span class="line"><span class="cl"><span class="n">[2</span><span class="p">,</span><span class="n">]</span>    <span class="m">4</span>    <span class="m">6</span>    <span class="m">8</span>
</span></span><span class="line"><span class="cl"><span class="n">[3</span><span class="p">,</span><span class="n">]</span>    <span class="m">6</span>    <span class="m">9</span>   <span class="m">12</span>
</span></span><span class="line"><span class="cl"><span class="n">[4</span><span class="p">,</span><span class="n">]</span>    <span class="m">8</span>   <span class="m">12</span>   <span class="m">16</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">month.abb</span>
</span></span><span class="line"><span class="cl"> <span class="n">[1]</span> <span class="s">&#34;Jan&#34;</span> <span class="s">&#34;Feb&#34;</span> <span class="s">&#34;Mar&#34;</span> <span class="s">&#34;Apr&#34;</span> <span class="s">&#34;May&#34;</span> <span class="s">&#34;Jun&#34;</span> <span class="s">&#34;Jul&#34;</span> <span class="s">&#34;Aug&#34;</span> <span class="s">&#34;Sep&#34;</span> <span class="s">&#34;Oct&#34;</span> <span class="s">&#34;Nov&#34;</span> <span class="s">&#34;Dec&#34;</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">outer</span><span class="p">(</span><span class="n">month.abb</span><span class="p">,</span> <span class="m">1999</span><span class="o">:</span><span class="m">2003</span><span class="p">,</span> <span class="n">FUN</span> <span class="o">=</span> <span class="s">&#34;paste&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">      <span class="n">[</span><span class="p">,</span><span class="m">1</span><span class="n">]</span>       <span class="n">[</span><span class="p">,</span><span class="m">2</span><span class="n">]</span>       <span class="n">[</span><span class="p">,</span><span class="m">3</span><span class="n">]</span>       <span class="n">[</span><span class="p">,</span><span class="m">4</span><span class="n">]</span>       <span class="n">[</span><span class="p">,</span><span class="m">5</span><span class="n">]</span>      
</span></span><span class="line"><span class="cl"> <span class="n">[1</span><span class="p">,</span><span class="n">]</span> <span class="s">&#34;Jan 1999&#34;</span> <span class="s">&#34;Jan 2000&#34;</span> <span class="s">&#34;Jan 2001&#34;</span> <span class="s">&#34;Jan 2002&#34;</span> <span class="s">&#34;Jan 2003&#34;</span>
</span></span><span class="line"><span class="cl"> <span class="n">[2</span><span class="p">,</span><span class="n">]</span> <span class="s">&#34;Feb 1999&#34;</span> <span class="s">&#34;Feb 2000&#34;</span> <span class="s">&#34;Feb 2001&#34;</span> <span class="s">&#34;Feb 2002&#34;</span> <span class="s">&#34;Feb 2003&#34;</span>
</span></span><span class="line"><span class="cl"> <span class="n">[3</span><span class="p">,</span><span class="n">]</span> <span class="s">&#34;Mar 1999&#34;</span> <span class="s">&#34;Mar 2000&#34;</span> <span class="s">&#34;Mar 2001&#34;</span> <span class="s">&#34;Mar 2002&#34;</span> <span class="s">&#34;Mar 2003&#34;</span>
</span></span><span class="line"><span class="cl"> <span class="n">[4</span><span class="p">,</span><span class="n">]</span> <span class="s">&#34;Apr 1999&#34;</span> <span class="s">&#34;Apr 2000&#34;</span> <span class="s">&#34;Apr 2001&#34;</span> <span class="s">&#34;Apr 2002&#34;</span> <span class="s">&#34;Apr 2003&#34;</span>
</span></span><span class="line"><span class="cl"> <span class="n">[5</span><span class="p">,</span><span class="n">]</span> <span class="s">&#34;May 1999&#34;</span> <span class="s">&#34;May 2000&#34;</span> <span class="s">&#34;May 2001&#34;</span> <span class="s">&#34;May 2002&#34;</span> <span class="s">&#34;May 2003&#34;</span>
</span></span><span class="line"><span class="cl"> <span class="n">[6</span><span class="p">,</span><span class="n">]</span> <span class="s">&#34;Jun 1999&#34;</span> <span class="s">&#34;Jun 2000&#34;</span> <span class="s">&#34;Jun 2001&#34;</span> <span class="s">&#34;Jun 2002&#34;</span> <span class="s">&#34;Jun 2003&#34;</span>
</span></span><span class="line"><span class="cl"> <span class="n">[7</span><span class="p">,</span><span class="n">]</span> <span class="s">&#34;Jul 1999&#34;</span> <span class="s">&#34;Jul 2000&#34;</span> <span class="s">&#34;Jul 2001&#34;</span> <span class="s">&#34;Jul 2002&#34;</span> <span class="s">&#34;Jul 2003&#34;</span>
</span></span><span class="line"><span class="cl"> <span class="n">[8</span><span class="p">,</span><span class="n">]</span> <span class="s">&#34;Aug 1999&#34;</span> <span class="s">&#34;Aug 2000&#34;</span> <span class="s">&#34;Aug 2001&#34;</span> <span class="s">&#34;Aug 2002&#34;</span> <span class="s">&#34;Aug 2003&#34;</span>
</span></span><span class="line"><span class="cl"> <span class="n">[9</span><span class="p">,</span><span class="n">]</span> <span class="s">&#34;Sep 1999&#34;</span> <span class="s">&#34;Sep 2000&#34;</span> <span class="s">&#34;Sep 2001&#34;</span> <span class="s">&#34;Sep 2002&#34;</span> <span class="s">&#34;Sep 2003&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">[10</span><span class="p">,</span><span class="n">]</span> <span class="s">&#34;Oct 1999&#34;</span> <span class="s">&#34;Oct 2000&#34;</span> <span class="s">&#34;Oct 2001&#34;</span> <span class="s">&#34;Oct 2002&#34;</span> <span class="s">&#34;Oct 2003&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">[11</span><span class="p">,</span><span class="n">]</span> <span class="s">&#34;Nov 1999&#34;</span> <span class="s">&#34;Nov 2000&#34;</span> <span class="s">&#34;Nov 2001&#34;</span> <span class="s">&#34;Nov 2002&#34;</span> <span class="s">&#34;Nov 2003&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">[12</span><span class="p">,</span><span class="n">]</span> <span class="s">&#34;Dec 1999&#34;</span> <span class="s">&#34;Dec 2000&#34;</span> <span class="s">&#34;Dec 2001&#34;</span> <span class="s">&#34;Dec 2002&#34;</span> <span class="s">&#34;Dec 2003&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h4 id="sweep">sweep</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="nf">sweep</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">MARGIN</span><span class="p">,</span> <span class="n">STATS</span><span class="p">,</span> <span class="n">FUN</span> <span class="o">=</span> <span class="s">&#34;-&#34;</span><span class="p">,</span> <span class="n">check.margin</span> <span class="o">=</span> <span class="kc">TRUE</span><span class="p">,</span> <span class="kc">...</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p><strong>参数列表：</strong>
x: 数组、矩阵
MARGIN：运算维度，1表示行，2表示列，3即第三维度，以此类推
STATS：运算参数，类似于减法中的减数，除法中的除数
FUN：要使用的函数</p>
</blockquote>
<p>{% label info@<b>举例阐释</b> %}</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">mat</span> <span class="o">&lt;-</span> <span class="nf">matrix</span><span class="p">(</span><span class="m">1</span><span class="o">:</span><span class="m">9</span><span class="p">,</span> <span class="m">3</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">mat</span>
</span></span><span class="line"><span class="cl">     <span class="n">[</span><span class="p">,</span><span class="m">1</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">2</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">3</span><span class="n">]</span>
</span></span><span class="line"><span class="cl"><span class="n">[1</span><span class="p">,</span><span class="n">]</span>    <span class="m">1</span>    <span class="m">4</span>    <span class="m">7</span>
</span></span><span class="line"><span class="cl"><span class="n">[2</span><span class="p">,</span><span class="n">]</span>    <span class="m">2</span>    <span class="m">5</span>    <span class="m">8</span>
</span></span><span class="line"><span class="cl"><span class="n">[3</span><span class="p">,</span><span class="n">]</span>    <span class="m">3</span>    <span class="m">6</span>    <span class="m">9</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">sweep</span><span class="p">(</span><span class="n">mat</span><span class="p">,</span> <span class="m">1</span><span class="p">,</span> <span class="nf">c</span><span class="p">(</span><span class="m">1</span><span class="p">,</span><span class="m">4</span><span class="p">,</span><span class="m">7</span><span class="p">),</span> <span class="s">&#34;+&#34;</span><span class="p">)</span>  <span class="c1"># 第一行都加1，第二行都加4，第三行都加7</span>
</span></span><span class="line"><span class="cl">     <span class="n">[</span><span class="p">,</span><span class="m">1</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">2</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">3</span><span class="n">]</span>
</span></span><span class="line"><span class="cl"><span class="n">[1</span><span class="p">,</span><span class="n">]</span>    <span class="m">2</span>    <span class="m">5</span>    <span class="m">8</span>
</span></span><span class="line"><span class="cl"><span class="n">[2</span><span class="p">,</span><span class="n">]</span>    <span class="m">6</span>    <span class="m">9</span>   <span class="m">12</span>
</span></span><span class="line"><span class="cl"><span class="n">[3</span><span class="p">,</span><span class="n">]</span>   <span class="m">10</span>   <span class="m">13</span>   <span class="m">16</span>
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">A</span> <span class="o">&lt;-</span> <span class="nf">array</span><span class="p">(</span><span class="m">1</span><span class="o">:</span><span class="m">24</span><span class="p">,</span> <span class="n">dim</span> <span class="o">=</span> <span class="m">4</span><span class="o">:</span><span class="m">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">median</span> <span class="o">&lt;-</span> <span class="nf">apply</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="m">1</span><span class="o">:</span><span class="m">2</span><span class="p">,</span> <span class="n">median</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">A</span>
</span></span><span class="line"><span class="cl"><span class="p">,</span> <span class="p">,</span> <span class="m">1</span>
</span></span><span class="line"><span class="cl">     <span class="n">[</span><span class="p">,</span><span class="m">1</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">2</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">3</span><span class="n">]</span>
</span></span><span class="line"><span class="cl"><span class="n">[1</span><span class="p">,</span><span class="n">]</span>    <span class="m">1</span>    <span class="m">5</span>    <span class="m">9</span>
</span></span><span class="line"><span class="cl"><span class="n">[2</span><span class="p">,</span><span class="n">]</span>    <span class="m">2</span>    <span class="m">6</span>   <span class="m">10</span>
</span></span><span class="line"><span class="cl"><span class="n">[3</span><span class="p">,</span><span class="n">]</span>    <span class="m">3</span>    <span class="m">7</span>   <span class="m">11</span>
</span></span><span class="line"><span class="cl"><span class="n">[4</span><span class="p">,</span><span class="n">]</span>    <span class="m">4</span>    <span class="m">8</span>   <span class="m">12</span>
</span></span><span class="line"><span class="cl"><span class="p">,</span> <span class="p">,</span> <span class="m">2</span>
</span></span><span class="line"><span class="cl">     <span class="n">[</span><span class="p">,</span><span class="m">1</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">2</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">3</span><span class="n">]</span>
</span></span><span class="line"><span class="cl"><span class="n">[1</span><span class="p">,</span><span class="n">]</span>   <span class="m">13</span>   <span class="m">17</span>   <span class="m">21</span>
</span></span><span class="line"><span class="cl"><span class="n">[2</span><span class="p">,</span><span class="n">]</span>   <span class="m">14</span>   <span class="m">18</span>   <span class="m">22</span>
</span></span><span class="line"><span class="cl"><span class="n">[3</span><span class="p">,</span><span class="n">]</span>   <span class="m">15</span>   <span class="m">19</span>   <span class="m">23</span>
</span></span><span class="line"><span class="cl"><span class="n">[4</span><span class="p">,</span><span class="n">]</span>   <span class="m">16</span>   <span class="m">20</span>   <span class="m">24</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">median</span>
</span></span><span class="line"><span class="cl">     <span class="n">[</span><span class="p">,</span><span class="m">1</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">2</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">3</span><span class="n">]</span>
</span></span><span class="line"><span class="cl"><span class="n">[1</span><span class="p">,</span><span class="n">]</span>    <span class="m">7</span>   <span class="m">11</span>   <span class="m">15</span>
</span></span><span class="line"><span class="cl"><span class="n">[2</span><span class="p">,</span><span class="n">]</span>    <span class="m">8</span>   <span class="m">12</span>   <span class="m">16</span>
</span></span><span class="line"><span class="cl"><span class="n">[3</span><span class="p">,</span><span class="n">]</span>    <span class="m">9</span>   <span class="m">13</span>   <span class="m">17</span>
</span></span><span class="line"><span class="cl"><span class="n">[4</span><span class="p">,</span><span class="n">]</span>   <span class="m">10</span>   <span class="m">14</span>   <span class="m">18</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">sweep</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="m">1</span><span class="o">:</span><span class="m">2</span><span class="p">,</span> <span class="n">median</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">,</span> <span class="p">,</span> <span class="m">1</span>
</span></span><span class="line"><span class="cl">     <span class="n">[</span><span class="p">,</span><span class="m">1</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">2</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">3</span><span class="n">]</span>
</span></span><span class="line"><span class="cl"><span class="n">[1</span><span class="p">,</span><span class="n">]</span>   <span class="m">-6</span>   <span class="m">-6</span>   <span class="m">-6</span>
</span></span><span class="line"><span class="cl"><span class="n">[2</span><span class="p">,</span><span class="n">]</span>   <span class="m">-6</span>   <span class="m">-6</span>   <span class="m">-6</span>
</span></span><span class="line"><span class="cl"><span class="n">[3</span><span class="p">,</span><span class="n">]</span>   <span class="m">-6</span>   <span class="m">-6</span>   <span class="m">-6</span>
</span></span><span class="line"><span class="cl"><span class="n">[4</span><span class="p">,</span><span class="n">]</span>   <span class="m">-6</span>   <span class="m">-6</span>   <span class="m">-6</span>
</span></span><span class="line"><span class="cl"><span class="p">,</span> <span class="p">,</span> <span class="m">2</span>
</span></span><span class="line"><span class="cl">     <span class="n">[</span><span class="p">,</span><span class="m">1</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">2</span><span class="n">]</span> <span class="n">[</span><span class="p">,</span><span class="m">3</span><span class="n">]</span>
</span></span><span class="line"><span class="cl"><span class="n">[1</span><span class="p">,</span><span class="n">]</span>    <span class="m">6</span>    <span class="m">6</span>    <span class="m">6</span>
</span></span><span class="line"><span class="cl"><span class="n">[2</span><span class="p">,</span><span class="n">]</span>    <span class="m">6</span>    <span class="m">6</span>    <span class="m">6</span>
</span></span><span class="line"><span class="cl"><span class="n">[3</span><span class="p">,</span><span class="n">]</span>    <span class="m">6</span>    <span class="m">6</span>    <span class="m">6</span>
</span></span><span class="line"><span class="cl"><span class="n">[4</span><span class="p">,</span><span class="n">]</span>    <span class="m">6</span>    <span class="m">6</span>    <span class="m">6</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h4 id="replicate">replicate</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="nf">replicate</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">expr</span><span class="p">,</span> <span class="n">simplify</span> <span class="o">=</span> <span class="s">&#34;array&#34;</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p><strong>参数列表：</strong>
n: 调用的次数
expr：调用的表达式</p>
</blockquote>
<p>{% label info@<b>举例阐释</b> %}</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">game</span> <span class="o">&lt;-</span> <span class="kr">function</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>   <span class="n">n</span> <span class="o">&lt;-</span> <span class="nf">sample</span><span class="p">(</span><span class="m">1</span><span class="o">:</span><span class="m">6</span><span class="p">,</span><span class="m">2</span><span class="p">,</span><span class="n">replace</span><span class="o">=</span><span class="bp">T</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>   <span class="kr">return</span><span class="p">(</span><span class="nf">sum</span><span class="p">(</span><span class="n">n</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">replicate</span><span class="p">(</span><span class="n">n</span><span class="o">=</span><span class="m">10</span><span class="p">,</span> <span class="nf">game</span><span class="p">())</span>
</span></span><span class="line"><span class="cl"> <span class="n">[1]</span>  <span class="m">6</span>  <span class="m">6</span>  <span class="m">6</span>  <span class="m">7</span>  <span class="m">7</span>  <span class="m">7</span> <span class="m">11</span>  <span class="m">8</span>  <span class="m">7</span>  <span class="m">9</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h4 id="aggregate">aggregate</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="nf">aggregate</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">by</span><span class="p">,</span> <span class="n">FUN</span><span class="p">,</span> <span class="kc">...</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p><strong>参数列表：</strong>
x: 一种R数据结构，通常为数据框
by：分组索引，必须为list格式
FUN：要使用的函数</p>
</blockquote>
<p>{% label info@<b>举例阐释</b> %}</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">data</span> <span class="o">&lt;-</span> <span class="nf">data.frame</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="nf">c</span><span class="p">(</span><span class="s">&#34;张三&#34;</span><span class="p">,</span><span class="s">&#34;李四&#34;</span><span class="p">,</span><span class="s">&#34;王五&#34;</span><span class="p">,</span><span class="s">&#34;赵六&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>              <span class="n">sex</span><span class="o">=</span><span class="nf">c</span><span class="p">(</span><span class="s">&#34;M&#34;</span><span class="p">,</span><span class="s">&#34;M&#34;</span><span class="p">,</span><span class="s">&#34;F&#34;</span><span class="p">,</span><span class="s">&#34;F&#34;</span><span class="p">),</span> <span class="n">age</span><span class="o">=</span><span class="nf">c</span><span class="p">(</span><span class="m">20</span><span class="p">,</span><span class="m">40</span><span class="p">,</span><span class="m">22</span><span class="p">,</span><span class="m">30</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"><span class="o">+</span>              <span class="n">height</span><span class="o">=</span><span class="nf">c</span><span class="p">(</span><span class="m">166</span><span class="p">,</span><span class="m">170</span><span class="p">,</span><span class="m">150</span><span class="p">,</span><span class="m">155</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">data</span>
</span></span><span class="line"><span class="cl">  <span class="n">name</span> <span class="n">sex</span> <span class="n">age</span> <span class="n">height</span>
</span></span><span class="line"><span class="cl"><span class="m">1</span> 张三   <span class="n">M</span>  <span class="m">20</span>    <span class="m">166</span>
</span></span><span class="line"><span class="cl"><span class="m">2</span> 李四   <span class="n">M</span>  <span class="m">40</span>    <span class="m">170</span>
</span></span><span class="line"><span class="cl"><span class="m">3</span> 王五   <span class="bp">F</span>  <span class="m">22</span>    <span class="m">150</span>
</span></span><span class="line"><span class="cl"><span class="m">4</span> 赵六   <span class="bp">F</span>  <span class="m">30</span>    <span class="m">155</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nf">aggregate</span><span class="p">(</span><span class="n">data[</span><span class="p">,</span><span class="m">3</span><span class="o">:</span><span class="m">4</span><span class="n">]</span><span class="p">,</span> <span class="n">by</span><span class="o">=</span><span class="nf">list</span><span class="p">(</span><span class="n">data</span><span class="o">$</span><span class="n">sex</span><span class="p">),</span> <span class="n">mean</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="n">Group.1</span> <span class="n">age</span> <span class="n">height</span>
</span></span><span class="line"><span class="cl"><span class="m">1</span>       <span class="bp">F</span>  <span class="m">26</span>  <span class="m">152.5</span>
</span></span><span class="line"><span class="cl"><span class="m">2</span>       <span class="n">M</span>  <span class="m">30</span>  <span class="m">168.0</span>
</span></span></code></pre></td></tr></table>
</div>
</div><br>
<hr>
<h2 id="致谢">致谢</h2>
<blockquote>
<h3 id="参考文章">参考文章</h3>
<ul>
<li><a href="https://www.cnblogs.com/aquastone/p/r-apply.html" target="_blank" rel="noopener noreffer">R语言apply函数族笔记</a></li>
<li><a href="http://blog.fens.me/r-apply/" target="_blank" rel="noopener noreffer">掌握R语言中的apply函数族</a></li>
<li><a href="https://feng.li/" target="_blank" rel="noopener noreffer">Dr. Feng Li-Personal Site</a></li>
</ul>
</blockquote>
]]></content:encoded></item><item><title>回归分析系列2-简单线性回归</title><link>https://philohao.com/2018/03/20180311/</link><pubDate>Sun, 11 Mar 2018 10:00:00 +0800</pubDate><dc:creator>Jianfeng.Hao</dc:creator><author>haojianfeng1997@gmail.com (Jianfeng.Hao)</author><guid isPermaLink="true">https://philohao.com/2018/03/20180311/</guid><description>回归分析系列笔记，介绍简单线性回归的基本思想、模型形式和拟合逻辑。</description><content:encoded><![CDATA[<center><i>
    与大多数统计方法一样，回归也是一种简化数据的技术。<br>回归分析利用变量间的简单函数关系，用自变量对困变量进行"预测"，使"预测值"尽可能地接近因变量的"观测值" 。
</i></center>
<h2 id="本节综述">本节综述</h2>
<p>简单线性回归属于回归分析中最基础的一部分内容，仅仅涉及到两个变量之间的线性关系，但其作为学习多元回归乃至其他更复杂统计方法的基础，所以本节将先从理解&quot;回归&quot;这一概念人手，并讨论只有一个因变量和一个自变量的简单线性回归模型。</p>
<h2 id="理解回归">理解回归</h2>
<p>如何根据回归模型的构成形式理解回归模型的现实意义呢？在此，我们提出理解回归的三种视角：</p>
<div class="note info"><p>
    1. 因果性：观测项 = 机制项 + 干扰项<br>
    2. 预测性：观测项 = 预测项 + 误差项<br>
    3. 描述性：观测项 = 概括项 + 残差项
</p></div>
<p>这三种理解方式提供了定量分析的三种不同视角：</p>
<ul>
<li>第一种方式接近于 <strong>古典计量经济学</strong> 的视角，这种方法试图找出具有决定性的模型并以此发现数据产生的机制。但当前更多的方法论研究者认为，所谓的&quot;真实&quot;模型并不存在，好的模型只是相对于其他模型而言更实用、更有意义或者更接近真实。</li>
<li>第二种方式适用于 <strong>工程学</strong> 领域，它通常用于在已知一组自变量和因变量之间的关系后，应用新的数据给出有用的预测回答。这一理解方法的特点是我们只是通过经验规律来做预测，而对因果关系的机制不感兴趣或不在乎。</li>
<li>第三种方式反映了当今 <strong>定量社会科学和统计学</strong> 的主流观点。它希望在不曲解数据的情况下利用模型概括数据的基本特征。这种方法与第一种方法的不同之处在于它并不关注模型是否&quot;真实&quot;，而只关注其是否符合已被观察到的事实。</li>
</ul>
<div class="note primary"><p>
   在社会科学研究中，我们倾向于采用第三种视角，即统计模型的主要目标在于用最简单的结构和尽可能少的参数来概括大量数据所包含的主要信息。研究者需在精确性和简洁性之间进行权衡，从而找出最佳模型。
</p></div>
<h2 id="回归分析的步骤">回归分析的步骤</h2>
<blockquote>
<ol>
<li>问题的表述</li>
<li>变量的选择 - 专家论文、前人研究</li>
<li>数据的收集</li>
<li>模型设定 - 散点图、表达形式、基本假定</li>
<li>参数估计/模型拟合 - （加权）最小二乘法、极大似然法、岭估计法、主成分估计法</li>
<li>模型检验 - 假设检验、回归诊断</li>
<li>模型评价 - 拟合优度、交叉验证</li>
<li>解释预测</li>
</ol>
</blockquote>
<hr>
<h2 id="简单线性回归模型">简单线性回归模型</h2>
<h3 id="模型设定1--表达形式">模型设定1&ndash;表达形式</h3>
<p>开门见山，写出数学表达式：
$$
y_i=\beta_0 + \beta_1 x_i + \epsilon_i
$$</p>
<div class="note info"><p>
   这里：<br>
   Y 是一个随机变量；<br>
   X 虽被称作变量，但它的各个取值其实是已知的，只是其取值在不同的个体之间变动；<br>
   ε 是随机误差项，假定其为服从均值为 0、方差为 σ² 的正态分布的随机变量。
</p></div>
<p>对应指定的 $x_i$ 值，在一定的条件下，对公式求条件期望后得到 <strong>总体回归方程</strong>：
$$
E(Y|X=x_i) = \mu_i = \beta_0 + \beta_1x_i
$$
它表示，对于每一个特定的取值 $x_i$，观测值 y 实际上都来自一个均值为 μ、方差为 σ² 的正态分布，回归直线将穿过点 $(x_i,\mu_i)$，$\beta_0$ 就是回归直线在 y 轴上的截距，而 $\beta_1$ 则是回归直线的斜率。如下图所示：</p>
<p>![3_1 回归直线.PNG](<a href="https://blog-1255524710.cos.ap-beijing.myqcloud.com/images/3_1" target="_blank" rel="noopener noreffer">https://blog-1255524710.cos.ap-beijing.myqcloud.com/images/3_1</a> 回归直线.PNG)</p>
<p>无论回归模型还是回归方程，都是针对总体而言，是对总体恃征的总结和描述。所以，参数 $\beta_0$ 和 $\beta_1$ 也是总体的特征。当利用样本统计量 $b_0$ 和 $b_1$ 代替总体回归方程中的 $\beta_0$ 和 $\beta_1$ 时，就得到了 <strong>估计的回归方程或经验回归方程</strong>，其形式为：
$$
\hat{y} = b_0 + b_1x_i
$$
同时，我们也可以得到观测值与估计值之差，称为残差，记作 $e_i$，它对应的是公式中的总体随机误差项 $\epsilon_i$，观测值、估计值和残差这三者之间的关系可用下图加以说明。</p>
<p>![3_2 经验回归直线.PNG](<a href="https://blog-1255524710.cos.ap-beijing.myqcloud.com/images/3_2" target="_blank" rel="noopener noreffer">https://blog-1255524710.cos.ap-beijing.myqcloud.com/images/3_2</a> 经验回归直线.PNG)</p>
<br>
<hr>
<h3 id="模型设定2--基本假定诸多错误日后修正">模型设定2&ndash;基本假定[诸多错误，日后修正]</h3>
<p>可以看到在第一步的模型设定中我们首先做出了线性假定方可建立线性回归模型，同时假定 ε 的分布以便于确定 $y_i$ 的分布，接下来着重阐释简单线性回归模型中的诸多假定及这些假定存在的必要性。</p>
<h4 id="线性假定">线性假定</h4>
<p>该假定规定 Y 的条件均值是自变量 X 的线性函数：
$$
E(Y|X=x_i)=\mu_i = \beta_0 + \beta_1 x_i
$$</p>
<div class="note primary"><p>
   这里“线性”有双重含义，一方面可解释为变量 Y 和 X 之间是线性的，另一方面也可解释为回归函数关于参数是线性的。在某些情况下，我们可能会碰到非线性函数的情形。借助于数学上的恒等变换，我们有时可以将非线性函数转换成线性函数的形式。
</p></div>
<p>例如，对于 $y_i = \alpha x_i^\gamma \sigma_i$，通过变换可以得到:
$$
\ln y_i = \beta_0 + \beta_1 \ln x_i + \epsilon_i
$$
其中， $\beta_0=\ln \alpha ,\beta_1=\gamma ,\epsilon_i=\ln\sigma_i$。经过转换后的方程便可以运用最小二乘法，并使得估计值仍然保持最小二乘法估计值的性质。</p>
<h4 id="正交假定">正交假定</h4>
<p>正交假定包括：</p>
<blockquote>
<ol>
<li>误差项 ε 和 x 不相关，即 $Cov(X,\epsilon)=0$ ;</li>
<li>误差项 ε 的期望值为0，即 $E(\epsilon)=0$ ;
推导： 由正交假定可得 $Cov(\hat{y},\epsilon)=0$ 。</li>
</ol>
</blockquote>
<p>在线性假定和正交假定下，可以将简单线性回归方程中 y 的条件期望定义为:
$$
E(Y|x)=\beta_0 + \beta_1 x
$$
正交假定是一个关键的识别假定，它帮助我们从条件期望 E(Y|x) 中剥离出误差项。在这假定下，<strong>利用最小二乘估计得到的 β0 和 βl 的估计值 b0 和 b1 是无偏的</strong>[详见下方-各随机变量的分布]，即：
$$
\begin{align*}
E(b_0)&amp;=\beta_0 \
&amp; \
E(b_1)&amp;=\beta_1
\end{align*}
$$
这一假定是最小二乘估计的计算的理论依据，所以 <strong>最小二乘估计的结果一定无例外地满足如下公式</strong>:
$$
\begin{cases}
&amp;\sum_{i=1}^{n}e_i=0 \
&amp; \
&amp;\sum_{i=1}^{n}x_ie_i=0
\end{cases}
\rightleftharpoons
\begin{cases}
&amp; \frac{\partial D}{\partial b_0} = -2\sum_{i=1}^{n}(y_i-b_0-b_1x_i) = 0 \
&amp; \
&amp; \frac{\partial D}{\partial b_1} = -2\sum_{i=1}^{n}x_i(y_i-b_0-b_1x_i) = 0
\end{cases}
$$</p>
<h4 id="独立同分布假定">独立同分布假定</h4>
<p>也称 i.i.d 假定，是指误差项 ε 相互独立，并且遵循同一分布，有：
$$
\begin{align*}
\sigma_\epsilon^2 &amp;= \sigma^2 \
&amp; \
Cov(\epsilon_i,\epsilon_j)&amp;=0,\left (i\neq j  \right )
\end{align*}
$$</p>
<div class="note info"><p>
   尽管在没有 i. i. d 假定的情况下，最小二乘估计已经可以满足无偏性和一致性，但是同时满足前三个假定时，最小二乘估计值将是总体参数的"最佳线性无偏估计值"，也就是通常所说的BLUE (best linear unbiased estimator)。这里，"最佳"表示"最有效"，即抽样标准误最小。
</p></div>
<h4 id="正态分布假定">正态分布假定</h4>
<p>尽管 i.i.d 假定规定误差项 ε 独立且同分布，但是它仍然无法确定 ε 的实际分布。不过，对于大样本数据，我们可以根据中心极限定理对 β 进行统计推断。然而在小样本情况下，我们只有在假定 ε 服从正态分布时才能使用 t检验
$$
\epsilon_i \sim N(0,\sigma^2)
$$
此时，最小二乘估计与总体参数的最大似然估计(MLE) 结果一致(Lehmann &amp; CaseUa, 1998),也就是说 b0 和 b1 不仅是 β0 和 β1 的最佳线性无偏估计，而且是所有的 β0 和 β1 (线性和非线性的)无偏估计中的最佳选择。</p>
<div class="note primary"><p>
   之所以这么说是因为在所有无偏估计中，最大似然估计是最佳无偏估计值。需要注意的是，由于最大似然估计可以是非线性的，因此最大似然解释的有效性将比最小二乘解释的有效性更广。进一步讲，最大似然估计的统计推断在大样本情况下具有渐近性质。也就是说，当样本规模趋于无穷大时，最大似然估计不仅满足一致性(渐近无偏)，而且能够取得一致估计量中的最小方差。
</p></div>
<br>
<hr>
<h3 id="参数估计--最小二乘估计">参数估计&ndash;最小二乘估计</h3>
<p>回顾一下，前文建立的线性回归模型如下：
$$
y_i = \beta_0 + \beta_1x_i + \epsilon_i = E(y_i|x_i) + \epsilon_i = \mu_i + \epsilon_i
$$
在样本数据下得到拟合回归模型如下：
$$
y_i = b_0 + b_1x_i + e_i = \hat{y_i} + e_i
$$
各关系如图所示：</p>
<p><img
        class="lazyload"
        data-src="https://blog-1255524710.cos.ap-beijing.myqcloud.com/cover/%e5%b0%81%e9%9d%a23.PNG"
        data-srcset="https://blog-1255524710.cos.ap-beijing.myqcloud.com/cover/%e5%b0%81%e9%9d%a23.PNG, https://blog-1255524710.cos.ap-beijing.myqcloud.com/cover/%e5%b0%81%e9%9d%a23.PNG 1.5x, https://blog-1255524710.cos.ap-beijing.myqcloud.com/cover/%e5%b0%81%e9%9d%a23.PNG 2x"
        data-sizes="auto"
        alt="https://blog-1255524710.cos.ap-beijing.myqcloud.com/cover/封面3.PNG"
        title="封面3.PNG"
    /></p>
<p>最小二乘估计的基本思路便是 <strong>找到一条与所有现有数据垂直距离平方和最小的直线</strong>，即确保观测值和预测值的残差平方和最小：
$$
D = \sum_{i=1}^{n}e_i^2 = \sum_{i=1}^{n}(y_i-\hat{y_i})^2 = \sum_{i=1}^{n}(y_i-b_0-b_1x_i)^2
$$</p>
<div class="note info"><p>
   注意是残差平方和而非误差平方和！！！<br>
   这是因为当使用总体数据时得到的与所有观测点垂直距离平方和最小的直线便是总体回归线；当使用样本数据时得到的与所有观测点垂直距离平方和最小的直线只能是估计回归线。所以误差与总体回归线相匹配，残差与估计回归线相匹配，在样本数据下，我们得到的只能是估计回归线，最小二乘法中的"最小"也只能是"残差平方和最小"。
</p></div>
<p>为使残差平方和达到最小值，有：
$$
\begin{cases}
&amp; \frac{\partial D}{\partial b_0} = -2\sum_{i=1}^{n}(y_i-b_0-b_1x_i) = 0 \
&amp; \
&amp; \frac{\partial D}{\partial b_1} = -2\sum_{i=1}^{n}x_i(y_i-b_0-b_1x_i) = 0
\end{cases}
$$
整理得正态方程组：
$$
\begin{cases}
&amp; nb_0 + b_1\sum_{i=1}^{n}x_i = \sum_{i=1}^{n}y_i \
&amp; \
&amp; b_0\sum_{i=1}^{n}x_i + b_1\sum_{i=1}^{n}x_i^2 = \sum_{i=1}^{n}x_iy_i
\end{cases}
$$
求解得：
$$
\begin{align*}
b_0 &amp;= \frac{\sum x_i^2 \sum y_i - \sum x_i \sum x_iy_i}{n \sum x_i^2 - (\sum x_i)^2} \
&amp; \
b_1 &amp;= \frac{n \sum x_iy_i - \sum x_i \sum y_i}{n \sum x_i^2 - (\sum x_i)^2} \
&amp; \
&amp;= \frac{\sum (x_i - \bar{x})(y_i - \bar{y})}{\sum (x_i - \bar{x})^2} \
\end{align*}
$$
在实际计算时，我们通常使用下列两个化简后的式子：
$$
\begin{align*}
b_1 &amp;= \frac{\sum (x_i - \bar{x})(y_i - \bar{y})}{\sum (x_i - \bar{x})^2} \
&amp; \
&amp;= \frac{\sum (x_i - \bar{x})(y_i - \bar{y})/(n-1)}{\sum (x_i - \bar{x})^2/(n-1)} \
&amp; \
&amp;= S_{xy}/S_x^2 \
&amp;\
&amp;= r\frac{S_y}{S_x} \
&amp; \
b_0 &amp;= \bar{y} - b_1\bar{x}
\end{align*}
$$</p>
<br>
<hr>
<h3 id="小结--各随机变量的分布">小结&ndash;各随机变量的分布</h3>
<p>在上面的运算中，我们接触到的随机变量有 $\epsilon$、$y_i$、$b_0$、$b_1$ 等，接下来我们对这些随机变量的分布做个总结。</p>
<h4 id="epsilon">$\epsilon$</h4>
<p>根据简单线性回归的假定前提可知：$\epsilon \sim N(0,\sigma^2)$</p>
<h4 id="y_i">$y_i$</h4>
<p>由关系式 $y_i=\beta_0+\beta_1x_i+\epsilon_i$ 及 $\epsilon$ 的分布推知：$y_i \sim N(\beta_0+\beta_1x_i,\sigma^2)$</p>
<h4 id="b_0--b_1">$b_0$ 、 $b_1$</h4>
<p>求解 $b_0$ 和 $b_1$ 的分布需要一些技巧，首先对 $b_0$ 和 $b_1$ 的表达式稍加变形：
$$
\begin{cases}
b_0&amp;=\frac{\sum x_i^2 \sum y_i - \sum x_i \sum x_iy_i}{n \sum x_i^2 - (\sum x_i)^2} \
&amp; \
&amp;=\sum \left [ \frac{1}{n}-\frac{(x_i-\bar{x})\bar{x}}{\sum (x_i-\bar{x})^2} \right ]y_i \
&amp; \
b_1&amp;=\frac{\sum (x_i - \bar{x})(y_i - \bar{y})}{\sum (x_i - \bar{x})^2} \
&amp; \
&amp;=\sum \frac{x_i-\bar{x}}{\sum (x_i-\bar{x})^2}y_i
\end{cases}
$$
可以看到，当 $x_i$ 确定，等式右端仅有 $y_i$ 为随机变量，并且现在 $y_i$ 的分布已知，$b_0$ 和 $b_1$ 的分布自然可以求出：</p>
<ul>
<li>期望
$$
\begin{align*}
E(b_1)&amp;= \sum \frac{x_i-\bar{x}}{\sum (x_i-\bar{x})^2} E(y_i) \
&amp; \
&amp;= \sum \frac{x_i-\bar{x}}{\sum (x_i-\bar{x})^2} (\beta_0+\beta_1x_i) \
&amp; \
&amp;= \sum \frac{x_i-\bar{x}}{\sum (x_i-\bar{x})^2} (\beta_0+\beta_1x_i) \leftarrow \beta_0=\bar{y}-\beta_1\bar{x} \bigstar  \
&amp; \
&amp;= \frac{\sum \left [ (x_i-\bar{x})\bar{y}+\beta_1 (x_i-\bar{x})^2 \right ]}{\sum (x_i-\bar{x})^2}
&amp; \
&amp;= \beta_1
\end{align*}
$$</li>
</ul>
<p>$\bigstar$：我们知道对样本数据有 $b_0=\bar{y}-b_1\bar{x}$，同时可推导出在总体数据中存在以下关系式：
$$
\begin{cases}
&amp;\beta_0 = y_i-\beta_1x_i-\epsilon_i \
&amp; \
&amp; \Rightarrow  E(\beta_0)=E(y_i-\beta_1x_i-\epsilon_i)  \
&amp; \
&amp;\Rightarrow  \beta_0=E(y)-\beta_1E(x_i)
\end{cases}
$$</p>
<div class="note info"><p>
   需要注意的是：<br>
   在第一个式子中，x 和 y 使用的是样本数据，得出的均值是样本均值；<br>
   在第二个式子中，x 和 y 使用的是总体数据，得出的期望是总体均值。<br>
   由于样本均值是总体均值的无偏估计，所以我们在推导 b1 的期望时使用的 β0 代换式是成立的。
</p></div>
<p>再次应用这个性质 ——— 无偏估计，可以很容易的得到 $b_0$ 的期望：
$$
\begin{align*}
E(b_0)&amp;=E(\bar{y}-b_1\bar{x}) \
&amp; \
&amp;= E(y)-\beta_1E(x) \
&amp; \
&amp;= \beta_0
\end{align*}
$$</p>
<ul>
<li>方差
$$
\begin{align*}
Var(b_0)&amp;= \sum  \left { \left [ \frac{1}{n}-\frac{(x_i-\bar{x})\bar{x}}
{\sum (x_i-\bar{x})^2} \right ]^2 Var(y_i) \right }  \
&amp; \
&amp;= \sigma^2 \sum \left [ \frac{1}{n}-\frac{(x_i-\bar{x})\bar{x}}
{\sum (x_i-\bar{x})^2} \right ]^2 \
&amp; \
&amp;= \sigma^2 \sum \left [ \frac{1}{n^2}-\frac{(x_i-\bar{x})\bar{x}}{2n\sum (x_i-\bar{x})^2}+
\frac{(x_i-\bar{x})^2\bar{x}^2}{\sum (x_i-\bar{x})^2} \right ] \
&amp; \
&amp;= \sigma^2 \left [ \frac{1}{n}+\frac{\bar{x}^2}{\sum (x_i-\bar{x})^2} \right ] \
&amp; \
&amp; \
Var(b_1)&amp;= \sum \left { \left [ \frac{x_i-\bar{x}}{\sum (x_i-\bar{x})^2} \right ]^2 Var(y_i) \right } \
&amp; \
&amp;= \sigma^2 \frac{\sum (x_i-\bar{x})^2}{[\sum (x_i-\bar{x})^2]^2}  \
&amp; \
&amp;= \frac{\sigma^2}{\sum (x_i-\bar{x})^2}
\end{align*}
$$</li>
</ul>
<p>可以看到在 $\epsilon$、$y_i$、$b_0$、$b_1$ 的分布中都有 $\sigma^2$ 的身影，但 $\sigma^2$ 目前还属于未知参数，所以接下来要做的就是构造 $\sigma^2$ 的估计量 $\hat{\sigma}^2$ 。</p>
<h4 id="hatsigma2">$\hat{\sigma}^2$</h4>
<p>由于 $\sigma^2$ 是总体中误差的方差，自然想到用样本中误差（即残差）的方差来做无偏估计：
$$
\hat{\sigma}^2 = \frac{\sum e_i^2}{n-2} = \frac{\sum (y_i-\hat{y_i})^2}{n-2}
= \frac{SSE}{n-2}
$$</p>
<p>这里，$n-2$ 为总体误差方差的自由度。因为我们需要以回归直线为基准来计算 $e_i$ ( 即以 $y_i-\hat{y}_i$ 进行估计)，而决定这条直线需要估计截距和斜率两个参数，所以消耗了两个自由度。</p>
<br>
<hr>
<h3 id="模型检验--假设检验">模型检验&ndash;假设检验</h3>
<h4 id="模型整体检验">模型整体检验</h4>
<h4 id="回归系数检验">回归系数检验</h4>
<br>
<hr>
<h3 id="模型评价--拟合优度">模型评价&ndash;拟合优度</h3>
<br>
<hr>
<h3 id="模型预测--响应值响应均值">模型预测&ndash;响应值、响应均值</h3>
<br>
<hr>
<h2 id="前景展望">前景展望</h2>
<ol>
<li>需要提醒的是 OLS 回归方法找出的是两个变量间最佳的线性关系，但实际情况中两个变量间可能并不是简单的线性关系。因为社会现象往往受到诸多因素的共同影响，单因素造成某一社会现象的情况几乎不存在。但是，了解简单回归的原理是学习多元回归乃至其他更复杂统计方法的基础。</li>
<li>同时，在简单线性回归中除了最小二乘法还有多种进行参数估计的方法可以运用，其中最大似然法的思想其实是与最小二乘法相通的。</li>
<li>此外，尽管我们可以根据基本假定估计出回归模型，但是我们不知道这些假定是否成立。诊断数据仍然是必不可少的一个环节。这部分内容我们将在之后的系列 <strong>回归诊断</strong> 中进行详细讨论。</li>
</ol>
<blockquote>
<h3 id="参考文章">参考文章</h3>
<p>[1]谢宇著.回归分析[M].北京：社会科学文献出版社.2010.
[2]（美）查特吉著.例解回归分析 原书第5版[M].北京：机械工业出版社.2013.</p>
</blockquote>]]></content:encoded></item><item><title>回归分析系列1-统计概念基础</title><link>https://philohao.com/2018/03/20180310/</link><pubDate>Sat, 10 Mar 2018 12:19:00 +0800</pubDate><dc:creator>Jianfeng.Hao</dc:creator><author>haojianfeng1997@gmail.com (Jianfeng.Hao)</author><guid isPermaLink="true">https://philohao.com/2018/03/20180310/</guid><description>回归分析入门笔记，梳理定量研究、变量、描述统计和推论统计等基础概念。</description><content:encoded><![CDATA[<center><i>
    尽管定量研究的结论建立在一定假设条件上，不一定具有普遍意义，但定量研究方法却是研究社会现象不可缺少的工具。<br>这是因为，如果没有这种方法，我们就无法很好地捕捉和表述研究对象的变异性
</i></center>
<h2 id="本节综述">本节综述</h2>
<p>本章着重介绍一些最基本的统计概念，比如总体、样本、随机变量、概率、期望、方差、标准差、协方差和相关系数等。这些概念着似简单，但却是线性回归方法的基础。只有真正熟练掌握并理解这些概念，才能在后面的学习中游刃有余。</p>
<h2 id="概念掌握">概念掌握</h2>
<h3 id="期望与条件期望">期望与条件期望</h3>
<ol>
<li>期望
离散型： $E(X)=\sum_{i=1}^{n}x_{i}P(x_{i})$<br>
连续型： $E(X)=\int_{-\infty }^{+\infty}xf(x)dx$</li>
</ol>
<div class="note info"><p>期望其实与均值类似，是个平均数，但两者之间的区别在于均值是根据某一变量的一系列已知取值求得的，因此，均值往往被特定地用来指称样本的一个特征，而期望代表的是整个总体的平均数、一个未知的总体参数，因此，它只是一个理论值。</p></div>
2. 条件期望
离散型：$E(Y|X=x_{i})=\sum_{i=1}^{n}y_{i}p(Y=y_{i}|X=x_{i})$
连续型：$E(Y|X)=\int yf_{Y|X}(y|x)dy$
<div class="note info"><p>条件期望有以下性质：<br>
2.1 若 X 与 Y 相互独立，则 $E(Y|X)=E(Y)$ <br>
2.2 若 $k_{1}$,$k_{2}$ 为常数，则 $E[(k_{1}Y_{1}+k_{2}Y_{2})|X]=k_{1}E(Y_{1}|X)+k_{2}E(Y_{2}|X)$ <br>
2.3 全期望公式/迭代期望法则 $E(Y)=E_{x}[E(Y|X)]$</p></div>
<h3 id="总体方差与样本方差">总体方差与样本方差</h3>
<ol>
<li>总体方差</li>
</ol>
<p>$$
\begin{align*}
Var(X)&amp;=\sum_{i=1}^{n}[x_{i}-E(X)]^{2}P(x_{i}) \
&amp; \
&amp;=E[X-E(X)]^{2} \<br>
&amp; \
&amp;=E(X^{2})-[E(X)]^{2}
\end{align*}
$$</p>
<ol start="2">
<li>样本方差</li>
</ol>
<p>$$
S^{2}=\frac{1}{n-1}\sum_{i=1}^{n}(x_{i}-\bar{X})^{2}
$$</p>
<h3 id="总体标准差样本标准差与标准误">总体标准差、样本标准差与标准误</h3>
<p>总体标准差：$\sigma (X)=\sqrt{Var(X)}$
样本标准差：$S=\sqrt{S^{2}}$
标准误：$S.E.=\sigma /\sqrt{n}$</p>
<p>![1_2 三种分布.PNG](<a href="https://blog-1255524710.cos.ap-beijing.myqcloud.com/images/1_2" target="_blank" rel="noopener noreffer">https://blog-1255524710.cos.ap-beijing.myqcloud.com/images/1_2</a> 三种分布.PNG)</p>
<h3 id="标准化随机变量">标准化随机变量</h3>
<p>$$z=\frac{X-E(X)}{\sigma (X)}$$
在多元线性回归中，由于不同自变量的测量单位通常并不一致，因而得到的回归系数通常也不能直接进行相对大小的比较。但如果我们对随机变量进行标准化，消除了变量各自测量单位的影响，得到的标准化回归系数之间就能够进行比较了。标准化经常被用来解决由于变量测量单位不同而导致的结果不可比的问题。</p>
<div class="note info"><p>标准化以后的新变量变成了一个均值为0 、方差为1 的变量。</p></div>
<h3 id="协方差与相关系数">协方差与相关系数</h3>
<ol>
<li>总体协方差
协方差用于测量两个随机变量之间的线性关系。注意，这里强调了 <strong>线性</strong> 这个词。
$$
\begin{align*}
Cov(X,Y)&amp;=\sum_{i}\sum_{j}[x_{i}-E(X)][y_{i}-E(Y)]P(x_{i},y_{i}) \
&amp; \
&amp;=E\left {[X-E(X)][Y-E(Y)] \right }  \
&amp; \
&amp;=E(XY)-E(X)E(Y)
\end{align*}
$$</li>
</ol>
<div class="note primary"><p>其实，方差是协方差的一个特例，也就是说，X 的方差就是X 与其自身的协方差。</p></div>
2. 总体相关系数
$$
\rho (X,Y)=\frac{Cov(X,Y)}{\sigma (X)\sigma (Y)}
$$
3. 样本协方差
$$
S_{yx}=\frac{\sum_{i=1}^{n}(x_{i}-\bar{x})(y_{i}-\bar{y})}{n-1}
$$
4. 样本相关系数
$$
\begin{align*} 
 S_{yx}&=\frac{\sum_{i=1}^{n}(x_{i}-\bar{x})(y_{i}-\bar{y})}{n-1} \\ 
 & \\
 &\xrightarrow[standardized]{z_{i}=\frac{y_{i}-\bar{y}}{S_{y}}} \\ 
 & \\
 r_{yx}&=\frac{1}{n-1}\sum_{i=1}^{n} (\frac{y_{i}-\bar(y)}{s_{y}}) (\frac{x_{i}-\bar(x)}{s_{x}}) \\
 & \\
 &= S_{yx}/S_yS_x \\
 & \\
 &=\frac{\sum_{i=1}^{n} (y_{i}-\bar(y)) (x_{i}-\bar(x))}{\sqrt{\sum_{i=1}^{n} (y_{i}-\bar(y))^2 (x_{i}-\bar(x))^2}}
\end{align*}
$$
<div class="note primary"><p>相关系数，即标准化协方差，消除了量纲的影响，所以相关系数之间可以直接进行比较，刻画了线性相关关系的强弱与方向。</p></div>
<h2 id="性质掌握">性质掌握</h2>
<h3 id="随机变量的和与差">随机变量的和与差</h3>
<ol>
<li>如果X 和Y 是两个随机变量，那么X+Y 的期望与方差为:
期望：$E(X+Y)=E(X)+E(Y)$
方差：$Var(X+Y)=Var(X)+Var(Y)+2Cov(X,Y)$</li>
</ol>
<div class="note info"><p>作为特例，如果X 和Y 相互独立，并且都服从正态分布，它们的和将服从均值为μ1+μ2、方差为σ1²+σ2² 的正态分布。</p></div>
2. 如果X 和Y 是两个随机变量，那么X-Y 的期望与方差为：
期望：$E(X-Y)=E(X)-E(Y)$
方差：$Var(X-Y)=Var(X)+Var(Y)-2Cov(X,Y)$
<div class="note info"><p>作为特例，如果X 和Y 相互独立，并且都服从正态分布，它们的差将服从均值为μ1-μ2、方差为σ1²+σ2² 的正态分布。</p></div>
3. 依此类推，如果 $T=X_1 +X_2 +...+X_s$ 是S 个独立随机变量的和，那么T 的期望与方差为:
期望：$E(T)=\sum_{i=1}^{S}E(X_{i})$
方差：$Var(T)=\sum_{i=1}^{S}Var(X_{i})$
<h3 id="期望的简单代数运算性质">期望的简单代数运算性质</h3>
<p>$$E(a+bX)=a+bE(X)$$</p>
<h3 id="方差的简单代数运算性质">方差的简单代数运算性质</h3>
<p>$$Var(a+bX)=b^2Var(X)$$</p>
<h3 id="协方差的简单代数运算性质">协方差的简单代数运算性质</h3>
<ol>
<li>$Cov(X,X)=Var(X)$</li>
<li>$Cov(X,Y)=Cov(Y,X)$</li>
<li>$Cov(C,Y)=0$，C 为任意常数</li>
<li>$Cov(X_{1}+X_{2},Y)=Cov(X_{1},Y)+Cov(X_{2},Y)$</li>
<li>$Cov(a+bX,c+dY)=bd[Cov(X,Y)]$</li>
</ol>
<div class="note warning"><p>再次强调，对于方差和协方差，其变化只涉及测度，而不涉及位置。</p></div>
6. $\rho (a+bX,c+dY)=\rho (X,Y)$
<div class="note warning"><p>这个性质表明，无论是测度变化还是位置变化都不会影响相关系数。</p></div>
<h2 id="下节引读">下节引读</h2>
<p>由于个体异质性的存在，我们不能利用样本对总体中的个体进行任何推断，但是，概括性的总体特征——<strong>参数</strong>是相对稳定的，总体参数可以通过总体中的一个样本构建<strong>样本统计量</strong>来进行估计。
然而，样本提供的信息是有限的。那么，接下来的问题就在于如何依据样本信息来认识所研究的总体。统计推断在这里扮演着关键角色。所谓统计推断，就是通过样本统计量来推断未知的总体参数。</p>
<blockquote>
<h3 id="参考文章">参考文章</h3>
<p>[1]谢宇著.回归分析[M].北京：社会科学文献出版社.2010.</p>
</blockquote>
<p>（yyyy-mm-dd@xx）</p>]]></content:encoded></item></channel></rss>