二. Factor 因子
1.创建一个factor,观察因子水平
gender = c("Male", "Male", "Female", "Female", "Male", "Female") # 字符向量
factor_gender = factor(gender) # 转换为因子,添加levels =c()可以自定义因子水平
levels(factor_gender) # 因子水平,结果为"Female" "Male"
levels(factor_gender) = c("女", "男") # 更改因子水平
as.numeric(factor_gender) # 将因子转换为用数字表示
summary(factor_gender) # 统计每个因子出现次数
2.有序因子
ordered_factor_gender = factor(gender, levels=c("男","女"), ordered=TRUE)
ordered_factor_gender # 将因子排列,结果为 Levels: 男 < 女
习题
Q1:创建一个字符向量, 元素是: gorilla,elephant,ant。
v1 = c("gorilla", "elephant", "ant")
Q2:基于Q1中的v1字符向量创建一个无序因子向量, 三个因子水平按照字母顺序排列。
v2 = factor(v1)
Q3:基于Q1中的v1字符向量创建一个有序因子向量, 三个因子水平按照体重从小到大排列。
v3 = factor(v1, levels = c("ant","gorilla","elephant",ordered = TRUE)
三.Matrix 矩阵
1.创建一个矩阵
R中的matrix是一种二维的对象,矩阵里面的元素必须是同一种数据类型的(numeric, character, logical)。
mat1 = matrix(1:6, nrow=3, ncol=2) # 创建一个1按列排列的3行2列的矩阵
matrix(1:6, nrow=3) # 数值确定,行或列数确定就可以确定一个矩阵
mat2 = matrix(1:6, nrow=3, byrow=TRUE) # 按行排列
matrix(rep(0, 8), nrow=4, ncol=2) # rep(0,8):创建8个0
matrix(0, nrow=4, ncol=2)
matrix(letters, ncol=2) # 字符矩阵
2.矩阵的name
矩阵是两维的, 所以有rownames和colnames
rownames(mat1) = c("row1","row2","row3") # 设置行名
colnames(mat1) = c("col1","col2") # 设置列名
rownames(mat1) = NULL # 删除行名
colnames(mat1) = NULL # 产出列名
dimnames(mat1) = NULL # 删除行名和列名
3.矩阵的索引和筛选
mat3 = matrix(1:24, nrow=6)
mat3[1,1] # 选取第1行第1列
mat3[2,] # 选取第2行
mat3[,3] # 选取第3列
mat3[1:3, 1:2] # 选取第1-3行和第1-2列
mat3[3:5, c(1,4)] #选取第3-5行和第1列,第4列
mat3[-1,] # 删除第1行
mat3[,-2] # 删除第2列
mat3[-1,-2] # 删除第1行第2列
mat3[7] # 选取第7个元素,默认按列排列
as.vector(mat3) # 将矩阵转换为向量
注意:执行mat3[-1,]这些操作后,mat3并没有改变,必须将索引赋值给mat3后才会改变。
4.矩阵的其他操作
cbind(mat3, 1:6) # 在后增加一列
cbind(1:6, mat3) # 在前增加一列
rbind(mat3, 1:4) # 在后增加一行
rbind(mat3, 0) # 缺的元素会自动用0补齐
mat4 = matrix(6, nrow=3, ncol=4)
rbind(mat3, mat4) # 合并矩阵,增加行数,列数不变
mat5 = matrix(0, nrow=6, ncol=2)
cbind(mat3, mat5) # 合并矩阵,增加列数,行数不变
mat6 = matrix(4:9, nrow=3, byrow=TRUE)
t(mat6) # 矩阵转置
dim(mat6) # 查看矩阵的行数和列数
length(mat6) # 计算矩阵元素个数
mat6 * mat2 # 各个元素对应位置相乘
mat6 %*% t(mat2) # 矩阵乘法
习题
Q1: 创建一个10行5列的矩阵, 其中的元素为1-50,按行排列,并设置行名为row1-row10,列名为col1-col5,将这个矩阵保存为 m1。
m1 = matrix(1:50, nrow = 10, byrow = T)
rownames(m1) = paste("row",1:10,sep="")
colnames(m1) = paste("col",1:5,sep="")
Q2:从 m1 中选择前5行和前3列, 并保存为 m2。
m2 = m1[1:5,1:3]
Q3:从 m1 中选择所有的偶数行和奇数列, 并保存为 m3。
m3 = m1[1:nrow(m1) %% 2 == 0, 1:ncol(m1) %% 2 == 1]
Q4:按行合并 m2 和 m3, 并保存为m4, 观察m4的rownames和colnames。
m4 = rbind(m2, m3)
m4
Q5:计算 m4的转置 与 自己的乘积, 记为m5。
m5 = t(m4) %*% m4
Q6:清除 m5 的dimnames。
dimnames(m5) = NULL
Q7:求解下面的方程组:
- 2x + 3y = 12
- 6x - 4y = 10
A = rbind(c(2,3), c(6,-4))
b = c(12, 10)
solve(A, b)