可视化:RStudio 入门知识 其二

241 阅读2分钟

本文已参加「新人创作礼」活动,一起开启掘金创作之路。

这次带来的是 RStudio 的入门知识。

各个知识点后面都有对应的小练习哦,大家可以利用刚刚学到的知识来试着写写看!

Matrix 矩阵

在本节中, 我们将学习R中的矩阵(matrix). 包括如何创建矩阵对并对其做各种运算.

  • 什么是矩阵?
  • 创建一个矩阵
  • 矩阵的name ?
  • 矩阵的索引和筛选
  • 增加一列
  • 增加一行
  • 两个矩阵的合并
  • 矩阵的运算
  • 两种乘法
  • 求解线性方程组
什么是矩阵?
R中的 matrix 是一种二维的对象,
它里面的元素必须是同一种数据类型的(numeric, character, logical)
# 创建一个矩阵
mat1 = matrix(1:6, nrow=3, ncol=2)
mat1

matrix(1:6, nrow=3)

mat2 = matrix(1:6, nrow=3, byrow=TRUE)
mat2

matrix(rep(0, 8), nrow=4, ncol=2)
matrix(0, nrow=4, ncol=2)

matrix(letters, ncol=2)
matrix("s", ncol=2)
matrix("s", nrow=13, ncol=2)

matrix(TRUE, nrow=4, ncol=2)
mat2 < 2


# 矩阵的name ?
# 矩阵是两维的, 所以有rownames和colnames
rownames(mat1)
rownames(mat1) = c("row1","row2","row3")
mat1
colnames(mat1) = c("col1","col2")
mat1

rownames(mat1) = NULL
colnames(mat1) = NULL
dimnames(mat1) = NULL

# 矩阵的索引和筛选
mat3 = matrix(1:24, nrow=6)

mat3[1,1]
mat3[3,2]
mat3[2,]
mat3[,3]
mat3[1:3, 1:2]
mat3[3:5, c(1,4)]

mat3[-1,]
mat3[,-2]
mat3[-1,-2]

mat3[7] # 矩阵其实是一个向量, 所以很好理解为什么其元素默认是按列排的
as.vector(mat3)

# 删除某些列或某些行
mat3 = mat3[,-1] # 只需要筛选后重新赋值就可以了
mat3

# 增加一列
cbind(mat3, 1:6)
cbind(1:6, mat3)
mat3 = cbind(1:6, mat3)

# 增加一行
rbind(mat3, 1:4)
rbind(mat3, 0)

# 两个矩阵的合并
mat4 = matrix(6, nrow=3, ncol=4)
mat4
rbind(mat3, mat4)

mat5 = matrix(0, nrow=6, ncol=2)
mat5

cbind(mat3, mat5)

# 矩阵的运算
mat7 = matrix(4:9, nrow=3, byrow=TRUE)
mat7
t(mat7)
dim(mat7)
length(mat7)

mat7 + mat2
mat7 - mat2
mat7 * mat2
mat7 / mat2
mat7 %/% mat2
mat7 %% mat2

mat7 + 100

# 两种乘法
mat7 * mat2
mat7
mat1
mat7 %*% mat1
mat7 %*% mat2
mat7 %*% t(mat2)
t(mat7) %*% mat2

# 求解线性方程组
det(mat1)
det(mat1[-3,])
solve(mat1)
solve(mat1[-3,])

# 求解下面的方程组:
#  2x + 3y + 4z =  20
#  3x - 4y - 6z = -23
# -2x + 8y +  z =  17

A = matrix(
  c(2, 3, 4,
    3,-4,-6,
   -2, 8, 1),
  nrow=3, byrow=TRUE)

b = c(20, -23, 17)
solve(A) %*% b
solve(A, b)

习题

# Q1: 创建一个10行5列的矩阵, 其中的元素为1~50,按行排列,并设置行名为row1~row10,列名为col1~col5,将这个矩阵保存为 m1

# Q2: 从 m1 中选择前5行和前3列, 并保存为 m2

# Q3: 从 m1 中选择所有的偶数行和奇数列, 并保存为 m3

# Q4: 按行合并 m2 和 m3, 并保存为m4, 观察m4的rownames和colnames

# Q5: 计算 m4的转置 与 自己的乘积, 记为m5

# Q6: 清除 m5 的dimnames

# Q7: 用两种方法将 m5 中的第1行第2列的元素改为0

# Q8: 求 m5 的逆矩阵

# Q9: 求解下面的方程组:
#  2x + 3y = 12
#  6x - 4y = 10

Array 数组

向量是一维的结构, 矩阵是二维的结构, 而R中的数组是它们的拓展, 可以生成更高维的结构.

比如下面这个维度(dimension)为三的数组, 可以想象成一幢三层的楼房, 每一层都有6个房间, 一共有18个房间, 这些房间中可以储存同类型的元素.

image.png

图片来源于 yuxiang 大佬

  • 创建一个数组
  • 数组的索引
# 创建一个数组
arr1 = array(1:24, dim=c(2,4,3))
arr1
arr2 = array(letters[1:12], dim=c(2,3,2))
arr2
arr3 = array(1:120, dim=c(4,5,3,2))
arr3
arr4 = array(1:6, dim=c(2,3))
arr4
class(arr4)

# 数组的索引
arr1[,,1]
arr1[,,3]
arr1[,2,3]
arr1[1,,3]
arr1[1,2,]
arr1[1,,]

习题

# Q1: 创建一个4*5*2的数组, 里面的元素为1~40, 记为arr9

# Q2: arr9中第三维取2,第二维取3,得到的结果是什么?

# Q3: arr9中第25个元素是什么?

# Q4: arr9中的每一层都是一个矩阵, 它是按行还是按列排列的?

# Q5: 创建一个arr6, 其每一层的排列顺序(按行<->按列)与arr9相反

List 列表

列表是最灵活的数据类型. 我们可以在同一个列表中储存各种不同类型的对象.

本节将学习如何创建,命名,修改和选取列表中的一部分

  • 为什么需要列表?
  • 创建一个列表
  • 给列表命名
  • 从列表中选取元素
  • 修改列表
  • 合并列表
  • 转换成向量
为什么需要列表?
因为在处理一些比较复杂的数据时, 常常需要用多种类型的数据来从各个角度刻画我们的研究对象,
这就是列表最常用的使用场景. 很多模型都使用列表来保存数据.
# 创建一个列表
list1 = list(1:3, c(90, 94, 95), matrix(1:6,nrow=3))
list1
class(list1)

# 给列表命名
list2 = list(id = 1:3, math = c(90, 94, 95), A = matrix(1:6,nrow=3))
list2

list3 = list(c(90,85,87), TRUE)
list3
names(list3) = c("english", "pass")
list3

# 从列表中选取元素
list2[1]
class(list2[1])
list2$id
class(list2$id)
list2[[1]]
class(list2[[1]])

# 修改列表
list2[4] = "apple"
list2$citizen = "yes"
list2[9] = 'a'
list2[1] = 1:4
list2[[1]] = 1:4
list2$id = 1:5
list2$pass = TRUE
list2$x = list3

# 合并列表
c(list2, list1)

# 转换成向量
unlist(list1)
unlist(list2)

习题

# Q1: 创建一个列表, 包含数值向量,字符向量,矩阵
# Q2: 在这个列表中添加一个三维数组作为第四个元素
# Q3: 将这个列表合并在list1的后面