矩阵及数据框是平常我们处理数据时候常用到的原始数据,特别是数据框data.frame,其不要求每列向量的类型一致,最为常用。在处理数据时,我们经常需要对data.frame取子集,并赋值给新的data.frame,这样可以在不更改原始数据的前提下进行下一步处理,以下以data.frame为例介绍3中常用的二维数据集取子集,矩阵的办法是完全相同的
rm(list = ls())#清空环境变量
options(stringsAsFactors = F)#默认不把字符型变量当做因子
library(stringr)#处理字符串的超好用R包
data(mtcars)#加载数据集
df <- mtcars#定义数据集名称
attach(df)#加载数据集入当前环境
class(df)#查看数据集类型
str(df)
![](https://img.haomeiwen.com/i22546862/2ef8298bedeac315.png)
1.取子集的第一种办法为规定行数及列数
df[1:4,1:5]#表示取df数据集前4行及前5列,1:4#表示数字1到4
![](https://img.haomeiwen.com/i22546862/339a663b965cc866.png)
df[1,]#表示取第1行所有内容(第一行所有列)
![](https://img.haomeiwen.com/i22546862/eba80896d35b8ba4.png)
colnames(df)#表示取列名,可以看出与df[1,]的区别
![](https://img.haomeiwen.com/i22546862/a7a1cf8babc716f6.png)
df[,1]#表示取第1列所有内容(第一列所有行)
![](https://img.haomeiwen.com/i22546862/7eb1dfc9503dfbcc.png)
row.names(df)#表示取行名
![](https://img.haomeiwen.com/i22546862/f7d65f44bdd107cc.png)
2.取子集的第二种办法为指定行名及列名
我们需要取cyl和wt这两列前4行的内容可以用以下方法
df[1:4,c("cyl","wt")]
![](https://img.haomeiwen.com/i22546862/cfee47d9d0ef8ea5.png)
这里说下有的同学可能会写成df[1:4,"cyl","wt"]或[1:4,("cyl","wt")],这里说下中间那个逗号代表维度的意思,逗号前为行,逗号后为列,如果有三个逗号就说明df有三个维度,但实际df为数据框仅有两个维度。后面那种情况虽然注意到了这个问题,但是取子集的时候应该用向量来取,字符串组成向量的时候必须加上C了。
df["Mazda RX4",2:6]#取马自达RX4行2到6列的数据
![](https://img.haomeiwen.com/i22546862/7374591ace6965be.png)
3.第三种办法是用逻辑值取子集,取子集的行或者列的向量为一个逻辑值向量,其取值与行数或者列数相同
#取行名包含Merc行,1:4列的内容
df[str_detect(row.names(df),"Merc"),1:4]
![](https://img.haomeiwen.com/i22546862/b951481ec0b6b2b4.png)
以下分步骤说下
str_detect为stringr包的函数,其作用是在给定的字符串向量中寻找目标向量,简单理解为搜索就好
str_detect(row.names(df),"Merc")的意思是在row.names(df)的字符型向量中寻找"Merc"这一内容,返回为逻辑值,如下图
![](https://img.haomeiwen.com/i22546862/f2b76e63a589fdcd.png)
然后把此逻辑值带入取子集的中括号内就可以了
后续可以把这个子集赋值给一个新名字就可以啦
df_new <- df[str_detect(row.names(df),"Merc"),1:4]
df_new
![](https://img.haomeiwen.com/i22546862/c43ce66710efeb7a.png)
网友评论