上一节我们讲到了一些向量提取的操作。这一部分我们会讲一些数据框提取的操作。在R里面,数据框提取的基础操作跟向量很相似,还是以 [] 符号为基础。不过由于数据框是一个二维的数据结构,即有行与列,所以我们要以 dataframe[行索引, 列索引]
这种操作来提取数据框中的元素。
由于生统的数据一般只有两列,且比较长,可能不太适合演示,所以我这会用的还是之前糖尿病人的那个数据框。
> patientID <- c(1, 2, 3, 4)
> age <- c(25, 34, 28, 52)
> diabetes <- c("Type1", "Type2", "Type1", "Type1")
> status <- c("Poor", "Improved", "Excellent", "Poor")
> patientdata <- data.frame(patientID, age, diabetes, status)
> patientdata
patientID age diabetes status
1 1 25 Type1 Poor
2 2 34 Type2 Improved
3 3 28 Type1 Excellent
4 4 52 Type1 Poor
这次的内容参考了《R语言实战》的 4.10 部分,推荐大家可以去看一看。
数据框列的提取
根据坐标提取
跟我们之前介绍的向量读取差不多,也是可以利用坐标来读取。我们用坐标来提取第二列,即病人的年龄。
> patientdata[,2]
[1] 25 34 28 52
我们前面提到,逗号前面部分代表的是行索引(坐标可能更直白一点,但索引可能更正式一点,我还是用索引吧),逗号后面代表你要提取的列的索引。如果行的索引信息是缺失的话,那么就 R 就会默认你选择所有行。所以这里提取出了所有的 4 个病人的年龄。
根据列名提取
但这种坐标信息的提取是比较麻烦的,尤其是对于很多列的数据。你可能数不清你想要的那一列在第几列上。事实上,由于数据框的特殊数据格式,对于列的提取,也有了特殊的提取方式。因为数据框是一个二维数据结构,有行有列。意味着我们有行名和列名。所以在提取列的时候,我们也可以把列名放入原本数字索引在的地方,也可以达到跟数字索引提取同样的效果。
> patientdata[,"age"]
[1] 25 34 28 52
这里我们知道了我们的列名叫 age
,所以我们就把 age
加引号放入原本坐标在的那个地方,也顺利地提取出来了第二列,即病人的年龄。
$符号提取
数据框的提取还有一个简单的方式,就是在数据框后面加 $
符号,然后就会自动跳出你的列名,你只要选择你想要的列名也可以顺利的提取出来。
> patientdata$age
[1] 25 34 28 52
提取多列
多于多列数据的提取,还是用到我们上面提到的提取方法。
# 数字索引提取
> patientdata[,c(2,4)]
age status
1 25 Poor
2 34 Improved
3 28 Excellent
4 52 Poor
# 列名提取
> patientdata[,c("age","status")]
age status
1 25 Poor
2 34 Improved
3 28 Excellent
4 52 Poor
# $符号可能不行
事实上,在提取列的时候,还有一个小问题,可能大家并没有发现。就是我们在提取单列的时候,得到的是一个向量型的结果,但我们在提取多列的时候,得到的是一个数据框型的结果。
> class(patientdata[,"age"])
[1] "numeric"
> class(patientdata[,c("age","status")])
[1] "data.frame"
这是因为 R 会在你提取单列的时候,自动将得到的单列进行降维,将数据框变成向量。如果你并不想让数据进行降维,可以设置 drop = F
。
> patientdata[,"age",drop = F]
age
1 25
2 34
3 28
4 52
> class(patientdata[,"age",drop = F])
[1] "data.frame"
另一种在提取单列的时候,不降维的方法,就是你不遵循 [行索引,列索引] 这种格式,而是直接输入列索引,就像下面那样
> patientdata[2]
age
1 25
2 34
3 28
4 52
> patientdata["age"]
age
1 25
2 34
3 28
4 52
> class(patientdata["age"])
[1] "data.frame"
我个人不太推荐在生统做的时候用这个方式,还是建议老老实实按逗号的方式来提取,因为这样可能比较符合你的编程习惯。
但这种提出单列数据,自动降维的情况,对于我们生统是比较好的。因为像你后面做正态性检验等等,本质上你输入的应该是一串数值型的向量,而非是一个数据框。
数据框行的提取
行的提取跟列的提取很像,无非就是索引放在逗号前面。
# 根据数字索引
> patientdata[1,]
patientID age diabetes status
1 1 25 Type1 Poor
# 根据行名
> patientdata["1",]
patientID age diabetes status
1 1 25 Type1 Poor
大家可能会感到疑惑,1 和 "1" 难道不是一个东西么,事实上并不是。由于我们这里并没有给数据框赋予常见的那种行名,所以 R 会自动以数字即行号作为数据框的行名。所以 "1"
代表的其实是行名。这里为了更加清楚地展示,我们用人名来表示糖尿病人的行名。
# rownames可以赋予行名
rownames(patientdata) <- c("Paul","James","Wade", "Antony")
> patientdata
patientID age diabetes status
Paul 1 25 Type1 Poor
James 2 34 Type2 Improved
Wade 3 28 Type1 Excellent
Antony 4 52 Type1 Poor
# 根据行名
> patientdata["Paul",]
patientID age diabetes status
Paul 1 25 Type1 Poor
其实生统的作业不太会让你对某一行进行提取,更多的是提取出符合某一条件的几行来。这个就要涉及到我们之前讲到过的逻辑运算符了,这部分我们下一节再讲。
行列的提取
学会了提取列,也学会了提取行,行列就是你在 [] 里面,逗号前后都加上索引。但这个可能在生统中用处不大。
> patientdata[1:2,2:3]
age diabetes
1 25 Type1
2 34 Type2
参考文章
- 《R语言实战》4.10
网友评论