郭晓刚 發表於 2022-3-4 10:44:48

R语言向量下标和子集的使用

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>1.正整数下标</li><li>2.负整数下标</li><li>3.空下标与零下标</li><li>4.下标超界</li><li>5.逻辑下标</li><li>6.&nbsp;which()、which.min()、which.max() 函数</li><li>7.&nbsp;元素名</li><li>8.用 R 向量下标作映射</li><li>9.集合运算</li><li>练习&nbsp;</li></ul></div><p class="maodian"></p><h2>1.正整数下标</h2>
<p>首先定义一个x,然后对向量 x, 在后面加方括号和下标可以访问向量的元素和子集,如:</p>
<p><strong>&nbsp;定义一个x:</strong></p>
<div class="jb51code"><pre class="brush:plain;">x &lt;- c(1, 4, 6.25)
x</pre></div>
<p>返回:</p>
<p><img alt="" height="28" src="https://img.jbzj.com/file_images/article/202203/2022030410343383.png" width="494" /></p>
<p><strong>我们取出第二个元素:</strong></p>
<div class="jb51code"><pre class="brush:plain;">x</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="25" src="https://img.jbzj.com/file_images/article/202203/2022030410343384.png" width="455" /></p>
<p><strong>我们再修改第二个元素为 99 :</strong></p>
<div class="jb51code"><pre class="brush:plain;">x &lt;- 99; x</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="22" src="https://img.jbzj.com/file_images/article/202203/2022030410343385.png" width="533" /></p>
<p><strong>我们再取下第 1、3 号元素 :</strong></p>
<div class="jb51code"><pre class="brush:plain;">x</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="26" src="https://img.jbzj.com/file_images/article/202203/2022030410343386.png" width="469" /></p>
<p><strong>我们再修改第 1、3 号元素为 11,13 :</strong></p>
<div class="jb51code"><pre class="brush:plain;">x &lt;- c(11, 13); x</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="25" src="https://img.jbzj.com/file_images/article/202203/2022030410343487.png" width="490" /></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;若是<strong>下标可重复</strong>,又会如何,如:</p>
<div class="jb51code"><pre class="brush:plain;">x</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="26" src="https://img.jbzj.com/file_images/article/202203/2022030410343488.png" width="499" /></p>
<p class="maodian"></p><h2>2.负整数下标</h2>
<p><strong>负下标</strong>表示<strong>扣除</strong>相应的元素后的子集,如</p>
<div class="jb51code"><pre class="brush:plain;">x &lt;- c(1,4,6.25)
x[-2]</pre></div>
<p><strong>-2 表示倒数第二个</strong>;返回:</p>
<p style="text-align:center"><img alt="" height="24" src="https://img.jbzj.com/file_images/article/202203/2022030410343489.png" width="412" /></p>
<p><strong>再比如:</strong></p>
<div class="jb51code"><pre class="brush:plain;">x[-c(1,3)]</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="24" src="https://img.jbzj.com/file_images/article/202203/2022030410343490.png" width="462" /></p>
<p>负整数下标不能与正整数下标<strong>同时</strong>用来从某一向量中取子集,比如</p>
<div class="jb51code"><pre class="brush:plain;">x</pre></div>
<p>返回结果会报错:</p>
<p style="text-align:center"><img alt="" height="20" src="https://img.jbzj.com/file_images/article/202203/2022030410343491.png" width="691" /></p>
<p class="maodian"></p><h2>3.空下标与零下标</h2>
<p>x[] 表示取 x 的全部元素作为子集。这与 x 本身不同,比如</p>
<div class="jb51code"><pre class="brush:plain;">x &lt;- c(1,4,6.25)
x[]</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="24" src="https://img.jbzj.com/file_images/article/202203/2022030410343592.png" width="467" /></p>
<p>然后,我们对x 内的值进行修改</p>
<div class="jb51code"><pre class="brush:plain;">x[] &lt;- 999
x</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="25" src="https://img.jbzj.com/file_images/article/202203/2022030410343593.png" width="488" /></p>
<p>再如,另一种对x内的值进行修改</p>
<div class="jb51code"><pre class="brush:plain;">x &lt;- c(1,4,6.25)
x &lt;- 999
x</pre></div>
<p>返回结果只有一个值:</p>
<p style="text-align:center"><img alt="" height="28" src="https://img.jbzj.com/file_images/article/202203/2022030410343594.png" width="437" /></p>
<p>&nbsp;可能有人会问是否有&nbsp;x ,那就让我们看看</p>
<div class="jb51code"><pre class="brush:plain;">x</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="26" src="https://img.jbzj.com/file_images/article/202203/2022030410343595.png" width="506" /></p>
<p>那说明,<strong>x</strong> 是一种少见的做法,结果返回类型相同、长度为零的向量,如 <strong>numeric(0)</strong>。</p>
<p>相当于空集;且当 <strong> 0 与正整数</strong>下标一起使用时会被 <strong>忽略</strong>。当 0 与负整数下标一起使用时也会被 忽略。</p>
<p class="maodian"></p><h2>4.下标超界</h2>
<p>设向量 x 长度为 n , 则使用正整数下标时下标应在 {<!-- --> 1 , 2 , . . . , n } 中取值。</p>
<div class="jb51code"><pre class="brush:plain;">x &lt;- c(1,4,6.25)
x</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="25" src="https://img.jbzj.com/file_images/article/202203/2022030410343696.png" width="566" /></p>
<p>如果使用<strong>大于 n </strong>的下标,读取时<strong>返回缺失值</strong>,并不出错。</p>
<div class="jb51code"><pre class="brush:plain;">x</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="26" src="https://img.jbzj.com/file_images/article/202203/2022030410343697.png" width="537" /></p>
<p>给<strong>超出 </strong> <strong>n </strong> 的下标元素<strong>赋值</strong>,则向量<strong>自动变长</strong>,中间没有赋值的元素为缺失值。例如</p>
<div class="jb51code"><pre class="brush:plain;">x &lt;- 9
x</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="25" src="https://img.jbzj.com/file_images/article/202203/2022030410343698.png" width="504" /></p>
<p>虽然 R 的语法对下标超界不视作错误,但是这样的做法往往来自不良的程序思路,而且对程序效率有影响,所以实际编程中应<strong>避免下标超界</strong>。</p>
<p class="maodian"></p><h2>5.逻辑下标</h2>
<p>下标可以是与向量等长的逻辑表达式,一般是关于本向量或者与本向量等长的其它向量的比较结果,如 定义x</p>
<div class="jb51code"><pre class="brush:plain;">x &lt;- c(1,4,6.25)</pre></div>
<p>取出 x 的大于 3 的元素组成的子集</p>
<div class="jb51code"><pre class="brush:plain;">x</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="27" src="https://img.jbzj.com/file_images/article/202203/2022030410343699.png" width="427" /></p>
<p>逻辑下标除了用来对向量取子集,还经常用来对数据框取取子集,也用在向量化的运算中。例如,对如下示性函数</p>
<p style="text-align:center"><img alt="" height="86" src="https://img.jbzj.com/file_images/article/202203/20220304103437100.png" width="427" /></p>
<p>输入向量 x ,结果 y 需要也是一个向量,程序可以写成</p>
<div class="jb51code"><pre class="brush:plain;">f &lt;- function(x){
y &lt;- numeric(length(x))
y &lt;- 1
y &lt;- 0 # 此语句多余
y }</pre></div>
<p><strong>事实上还有一种写法</strong>,向量化的逻辑选择有一个 <strong>ifelse()</strong> 函数,比如,对上面的示性函数,如果 x 是一个向量,输出 y 向量可以写成&nbsp;</p>
<div class="jb51code"><pre class="brush:plain;">y &lt;- ifelse(x&gt;=0, 1, 0)</pre></div>
<p><strong>要注意的是</strong>,如果逻辑下标中有缺失值,对应结果也是缺失值,如</p>
<div class="jb51code"><pre class="brush:plain;">x &lt;- c(1, 4, 6.25, NA)
x</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="27" src="https://img.jbzj.com/file_images/article/202203/20220304103437101.png" width="388" /></p>
<p>所以,在用逻辑下标作子集选择时,一定要考虑到缺失值问题。 <strong>正确的做法</strong>是加上<strong>!is.na</strong> 前提,如</p>
<div class="jb51code"><pre class="brush:plain;">x[!is.na(x) &amp; x &gt; 2]</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="28" src="https://img.jbzj.com/file_images/article/202203/20220304103437102.png" width="404" /></p>
<p class="maodian"></p><h2>6.&nbsp;which()、which.min()、which.max() 函数</h2>
<p>函数 <strong>which() </strong> 可以用来找到满足条件的下标,如</p>
<div class="jb51code"><pre class="brush:plain;">x &lt;- c(3, 4, 3, 5, 7, 5, 9)
which(x &gt; 5)</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="25" src="https://img.jbzj.com/file_images/article/202203/20220304103437103.png" width="447" /></p>
<p><strong>seq(along=x) </strong>会生成由 x 的下标组成的向量,如</p>
<div class="jb51code"><pre class="brush:plain;">seq(along=x)</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="24" src="https://img.jbzj.com/file_images/article/202203/20220304103437104.png" width="442" /></p>
<p>用 <strong>which.min()</strong> 、<strong>which.max()</strong> 求最小值的下标和最大值的下标,不唯一时只取第一个。如</p>
<div class="jb51code"><pre class="brush:plain;">which.min(x)
which.max(x)</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="77" src="https://img.jbzj.com/file_images/article/202203/20220304103438105.png" width="458" /></p>
<p class="maodian"></p><h2>7.&nbsp;元素名</h2>
<p>向量可以为每个元素命名。如</p>
<div class="jb51code"><pre class="brush:plain;">ages &lt;- c(" 李明"=30, " 张聪"=25, " 刘颖"=28)</pre></div>
<p>或</p>
<div class="jb51code"><pre class="brush:plain;">ages &lt;- c(30, 25, 28)
names(ages) &lt;- c(" 李明", " 张聪", " 刘颖")</pre></div>
<p>或</p>
<div class="jb51code"><pre class="brush:plain;">ages &lt;- setNames(c(30, 25, 28), c(" 李明", " 张聪", " 刘颖"))</pre></div>
<p>这时可以用元素名或元素名向量作为向量的下标,如</p>
<div class="jb51code"><pre class="brush:plain;">ages[" 张聪"]</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="46" src="https://img.jbzj.com/file_images/article/202203/20220304103438106.png" width="549" /></p>
<p>&nbsp;再如:</p>
<div class="jb51code"><pre class="brush:plain;">ages</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="47" src="https://img.jbzj.com/file_images/article/202203/20220304103438107.png" width="542" /></p>
<p>再如,修改字符串数值:</p>
<div class="jb51code"><pre class="brush:plain;">ages[" 张聪"] &lt;- 26</pre></div>
<p>用字符串作为下标时,如果该<strong>字符串不在向量</strong>的元素名中,读取时<strong>返回缺失值</strong>结果,赋值时该向量会增加一个元素并以该字符串为元素名。 带有元素名的向量也可以是字符型或其它基本类型,如</p>
<div class="jb51code"><pre class="brush:plain;">sex &lt;- c(" 李明"=" 男", " 张聪"=" 男", " 刘颖"=" 女")</pre></div>
<p>除了给向量元素命名外,在矩阵和数据框中还可以给行、列命名,这会使得程序的扩展更为容易和安全。 R 允许仅给部分元素命名,这时其它元素名字为空字符串。不同元素的元素名一般应该是不同的,否则在使用元素作为下标时会发生误读,但是 R 语法允许存在重名。 用 <strong>unname(x)</strong> 返回去掉了元素名的 x 的副本,用 <strong>names(x) &lt;- NULL</strong> 可以去掉 x 的元素名。</p>
<p class="maodian"></p><h2>8.用 R<strong> </strong>向量下标作映射</h2>
<p>R 在使用整数作为向量下标时,允许使用重复下标,这样可以把数组 x 看成一个 1 : n 的整数到 x , x , . . . , x 的一个映射表 , 其中 n 是 x 的长度。 比如,某商店有三种礼品,编号为 1,2,3 ,价格分别为 68, 88 和 168 。令</p>
<div class="jb51code"><pre class="brush:plain;">price.map &lt;- c(68, 88, 168)</pre></div>
<p>设某个收银员在一天内分别售出礼品编号为 3,2,1,1,2,2,3 ,可以用如下的<strong>映射方式</strong>获得售出的这些礼品对应的价格:</p>
<div class="jb51code"><pre class="brush:plain;">items &lt;- c(3,2,1,1,2,2,3)
y &lt;- price.map
print(y)</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="26" src="https://img.jbzj.com/file_images/article/202203/20220304103438108.png" width="538" /></p>
<p>R 向量可以用字符型向量作下标,字符型下标也允许重复,所以可以把带有元素名的 R 向量看成是元素名到元素值的<strong>映射表</strong>。 比如,设 sex 为 10 个学生的性别(男、女)</p>
<div class="jb51code"><pre class="brush:plain;">sex &lt;- c(" 男", " 男", " 女", " 女", " 男", " 女", " 女", " 女", " 女", " 男")</pre></div>
<p>希望把每个学生按照性别分别对应到蓝色和红色。首先建立一个 R 向量当作<strong>映射</strong></p>
<div class="jb51code"><pre class="brush:plain;">sex.color &lt;- c(' 男'='blue', ' 女'='red')</pre></div>
<p>用 R 向量 <strong>sex.color </strong> 当作<strong>映射</strong>,可以获得每个学生对应的颜色</p>
<div class="jb51code"><pre class="brush:plain;">cols &lt;- sex.color; print(cols)</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="45" src="https://img.jbzj.com/file_images/article/202203/20220304103439109.png" width="780" /></p>
<p>这样的映射结果中带有<strong>不必要</strong>的元素名,用 <strong>unname() </strong> 函数可以去掉元素名,如</p>
<div class="jb51code"><pre class="brush:plain;">unname(cols)</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="26" src="https://img.jbzj.com/file_images/article/202203/20220304103439110.png" width="777" /></p>
<p class="maodian"></p><h2>9.集合运算</h2>
<p>可以把向量 x 看成一个<strong>集合</strong>,但是其中的元素<strong>允许有重复</strong>。用<strong> </strong> <strong>unique(x)</strong> 可以获得 x 的<strong>所有不同值</strong>。如</p>
<div class="jb51code"><pre class="brush:plain;">unique(c(1, 5, 2, 5))</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="26" src="https://img.jbzj.com/file_images/article/202203/20220304103439111.png" width="463" /></p>
<p>&nbsp;用 a <strong>%in%</strong> x 判断 a 的每个元素<strong>是否属于</strong>向量 x,如</p>
<div class="jb51code"><pre class="brush:plain;">5 %in% c(1,5,2)</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="28" src="https://img.jbzj.com/file_images/article/202203/20220304103440112.png" width="537" /></p>
<div class="jb51code"><pre class="brush:plain;">c(5,6) %in% c(1,5,2)</pre></div>
<p>返回</p>
<p style="text-align:center"><img alt="" height="26" src="https://img.jbzj.com/file_images/article/202203/20220304103440113.png" width="421" /></p>
<p>与 <strong>%in</strong> 运算符类似,函数 <strong>match(x, table) </strong> 对向量 x 的每个元素,从向量 <strong>table</strong> 中查找其首次出现位置并返回这些位置。没有匹配到的元素位置返回<strong>NA_integer_(</strong> <strong>整数型缺失值)</strong> 。如</p>
<p>&nbsp;一个数值判断:</p>
<div class="jb51code"><pre class="brush:plain;">match(5, c(1,5,2))</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="22" src="https://img.jbzj.com/file_images/article/202203/20220304103440114.png" width="465" /></p>
<p>若所匹配集合有重复元素,则返回为第一个元素的下标:</p>
<div class="jb51code"><pre class="brush:plain;">match(5, c(1,5,2,5))</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="28" src="https://img.jbzj.com/file_images/article/202203/20220304103440115.png" width="503" /></p>
<p>&nbsp;若匹配两个元素的所属呢?</p>
<div class="jb51code"><pre class="brush:plain;">match(c(2,5), c(1,5,2,5))</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="31" src="https://img.jbzj.com/file_images/article/202203/20220304103441116.png" width="403" /></p>
<p>&nbsp;若所匹配元素中,有集合中没有的呢?则返回空值,如</p>
<div class="jb51code"><pre class="brush:plain;">match(c(2,5,0), c(1,5,2,5))</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="26" src="https://img.jbzj.com/file_images/article/202203/20220304103441117.png" width="394" /></p>
<p>&nbsp;用 <strong>intersect(x,y)</strong> 求<strong>交集</strong>,结果中<strong>不含重复</strong>元素,如</p>
<div class="jb51code"><pre class="brush:plain;">intersect(c(5, 7), c(1, 5, 2, 5))</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="25" src="https://img.jbzj.com/file_images/article/202203/20220304103441118.png" width="403" /></p>
<p>用 <strong>union(x,y) </strong> 求<strong>并集</strong>,结果中不含重复元素,如</p>
<div class="jb51code"><pre class="brush:plain;">union(c(5, 7), c(1, 5, 2, 5))</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="27" src="https://img.jbzj.com/file_images/article/202203/20220304103441119.png" width="529" /></p>
<p>&nbsp; 用 <strong>setdiff(x,y) </strong> 求<strong>差集</strong>,即 x 的元素中不属于 y 的元素组成的集合,结果中不含重复元素,如</p>
<div class="jb51code"><pre class="brush:plain;">setdiff(c(5, 7), c(1, 5, 2, 5))</pre></div>
<p>&nbsp;返回:</p>
<p style="text-align:center"><img alt="" height="26" src="https://img.jbzj.com/file_images/article/202203/20220304103441120.png" width="494" /></p>
<p>&nbsp;用 <strong>setequal(x,y)</strong> 判断两个集合是否相等,不受次序与重复元素的影响,如</p>
<div class="jb51code"><pre class="brush:plain;">setequal(c(1,5,2), c(2,5,1))</pre></div>
<p style="text-align:center"><img alt="" height="27" src="https://img.jbzj.com/file_images/article/202203/20220304103442121.png" width="551" /></p>
<p>&nbsp;再如</p>
<div class="jb51code"><pre class="brush:plain;">setequal(c(1,5,2), c(2,5,1,5))</pre></div>
<p>返回:</p>
<p style="text-align:center"><img alt="" height="24" src="https://img.jbzj.com/file_images/article/202203/20220304103442122.png" width="538" /></p>
<p class="maodian"></p><h2>练习&nbsp;</h2>
<p>设文件 class.csv 内容如下 :<br />name,sex,age,height,weight<br />Alice,F,13,56.5,84<br />Becka,F,13,65.3,98<br />Gail,F,14,64.3,90<br />Karen,F,12,56.3,77<br />Kathy,F,12,59.8,84.5<br />Mary,F,15,66.5,112<br />Sandy,F,11,51.3,50.5<br />Sharon,F,15,62.5,112.5<br />Tammy,F,14,62.8,102.5<br />Alfred,M,14,69,112.5<br />Duke,M,14,63.5,102.5<br />Guido,M,15,67,133<br />James,M,12,57.3,83<br />Jeffrey,M,13,62.5,84<br />John,M,12,59,99.5<br />Philip,M,16,72,150<br />Robert,M,12,64.8,128<br />Thomas,M,11,57.5,85<br />William,M,15,66.5,112<br />用如下程序可以把上述文件读入为 R 数据框 d.class, 并取出其中的 name 和<br />age 列到变量 name 和 age 中:<br />d.class &lt;- read.csv ( &#39;class.csv&#39; , header= TRUE , stringsAsFactors= FALSE )<br />name &lt;- d.class[, &#39;name&#39; ]<br />age &lt;- d.class[, &#39;age&#39; ]<br />(1) 求出 age 中第 3, 5, 7 号的值;<br />(2) 用变量 age, 求出达到 15 岁及以上的那些值;<br />(3) 用变量 name 和 age, 求出 Mary 与 James 的年龄。<br />(4) 求 age 中除 Mary 与 James 这两人之外的那些人的年龄值,保存到变量 age1 中。<br />(5) 假设向量 x 长度为 n , 其元素是 { 1 , 2 , . . . , n } 的一个重排。可以把 x 看成一个 i 到 x 的映射 (i 在 { 1 , 2 , . . . , n } 中取值 ) 。求向量 y, 保存了上述映射的逆映射,即:如果 x=j, 则 y=i 。</p>
<p>到此这篇关于R语言向量下标和子集的使用的文章就介绍到这了,更多相关R语言向量下标和子集内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>R语言批量读取某路径下文件内容的方法</li><li>R语言因子类型的实现</li><li>基于R语言 数据检验详解</li><li>R语言使用cgdsr包获取TCGA数据示例详解</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: R语言向量下标和子集的使用