R语言学习6-矩阵和数据框
在本课程中,我们将学习矩阵和数据帧。两者都表示“矩形”数据类型,这意味着它们用于存储具有行和列的表格数据。
这两者的主要区别是,矩阵只能包含一种数据类型,而数据框可以包含多种数据类型。
矩阵
首先,让我们创建一个1-20
的向量my_vector
:
> my_vector <- 1:20
> my_vector
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
然后看看这个向量的维度,使用dim()
函数。
> dim(my_vector)
NULL
结果返回的是空值NULL
。为什么?因为my_vector
只是一个变量,它并没有维度属性。但是可以通过length()
获取向量的长度。
> length(my_vector)
[1] 20
可以看到,返回了正确的结果。如果我们想要给my_vector
设置维度属性,应该怎么办呢?答案是依然使用dim()
函数。通过对my_vector
的维度属性进行赋值来设置维度属性。
> dim(my_vector) <- c(4, 5)
> dim(my_vector)
[1] 4 5
我们还可以通过attributes()
函数来查看my_vector
的维度是否真的已经改变。
> attributes(my_vector)
$dim
[1] 4 5
现在my_vector
的维度属性是4 5
,这表示my_vector
有4
行,5
列。所以,my_vector
变成了一个矩阵。
> my_vector
[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 13 17
[2,] 2 6 10 14 18
[3,] 3 7 11 15 19
[4,] 4 8 12 16 20
使用class()
函数,确认my_vector
现在的数据类型。
> class(my_vector)
[1] "matrix"
果然,my_vector
现在是一个矩阵了。我们将其赋值给一个新的变量my_matrix
。
> my_matrix <- my_vector
到目前为止,我们使用的示例旨在说明矩阵只是具有维度属性的原子向量。创建相同矩阵的更直接方法是使用matrix()
函数。我们可以通过?matrix
命令来获取matrix()
函数的用法。
现在我们使用matrix()
来创建一个相同的矩阵。
> my_matrix2 <- matrix(1:20, 4, 5)
> identical(my_matrix, my_matrix2)
[1] TRUE
现在,假设我们表中的数字代表了一项临床实验的一些测量结果,其中每一行代表一名患者,每一列代表一个要进行测量的变量。我们可能要标记行,以便我们知道哪些数字属于实验中的每个患者。通常是在矩阵中添加一列,其中包含所有四个人的姓名。所以我们新建一个patients
的字符向量,里面是患者的名字。
> patients <- c("Bill", "Gina", "Kelly", "Sean")
然后我们使用cbind()
函数来进行列合并。
> cbind(patients, my_matrix)
patients
[1,] "Bill" "1" "5" "9" "13" "17"
[2,] "Gina" "2" "6" "10" "14" "18"
[3,] "Kelly" "3" "7" "11" "15" "19"
[4,] "Sean" "4" "8" "12" "16" "20"
我们的结果有些可疑!看起来,将字符向量与我们的数字矩阵结合在一起会使所有内容都用双引号引起来。这意味着我们最好得到的是字符串矩阵,这不好。还记得本课的开头说过的吗?矩阵只能包含一个类的数据。因此,当我们尝试将字符向量与数字矩阵组合时,R
被迫将数字“强制”为字符,因此使用双引号。这被称为隐式强制,因为我们没有去声明,R
自动转换了。
因此,我们还有一个问题,即如何在不破坏数字数据完整性的情况下将患者姓名包括在表格中?这就要用到数据框了。
数据框
要满足我们的需求,可以使用data.frame()
函数。
> my_data <- data.frame(patients, my_matrix)
> my_data
patients X1 X2 X3 X4 X5
1 Bill 1 5 9 13 17
2 Gina 2 6 10 14 18
3 Kelly 3 7 11 15 19
4 Sean 4 8 12 16 20
可以看到结果里的数字,并没有被转成字符串。
data.frame()
函数可以有任意数量的参数,并返回由原始对象组成的data.frame
类的单个对象。让我们用class()
确认一下my_data
的类型。
> class(my_data)
[1] "data.frame"
我们还可以为数据框的各个行和列分配名称,这提供了另一种可能的方式来确定表中的值属于哪个患者。
但是,由于我们已经解决了该问题,因此让我们通过为数据框的列分配名称来解决另一个问题,以便我们知道每一列代表的度量类型。
由于我们有6
列(包括患者姓名),因此我们需要首先创建一个包含6
个元素的向量cnames
。每个元素代表每一列的名称。
> cnames <- c("patient", "age", "weight", "bp", "rating", "test")
然后使用colnames()
函数来对数据框my_data
的列名进行赋值。
> colnames(my_data) <- cnames
> my_data
patient age weight bp rating test
1 Bill 1 5 9 13 17
2 Gina 2 6 10 14 18
3 Kelly 3 7 11 15 19
4 Sean 4 8 12 16 20
小结
在本课程中,我们学习了使用两个非常重要且通用的数据结构(矩阵和数据帧)的基础知识。还有很多东西要学习,我们将在以后的课程中涵盖更高级的内容,尤其是关于数据框架的内容。
矩阵
矩阵只能包含一种数据类型,如果两种数据类型的矩阵进行合并,则会被强制转换为一种。
1.可以通过dim()
,attributes
查看矩阵的维度;2.matrix()
函数创建矩阵;3.cbind()
函数列合并矩阵。
数据框
数据框可以包含多种数据类型,使用data.frame()
函数创建,会保留原始对象。