第三讲 R编程基础-矩阵和数据框
在“R与生物统计专题”中,我们会从介绍R的基本知识展开到生物统计原理及其在R中的实现。以从浅入深,层层递进的形式在投必得医学公众号更新。
在上一讲中,我们介绍了第二讲 R-编程基础-运算、数据类型和向量等基本介绍(戳这里即可跳转)。相信大家对R语言的基础知识已经有了一定的了解。
1. 矩阵
矩阵就像Excel的工作表。它用于组合具有相同类型的向量,可以是数字,字符或逻辑。矩阵用于将数据表存储在R中。
要轻松创建矩阵,请使用函数cbind()或rbind(),如下所示:
# 数字向量
col1 <- c(5, 6, 7, 8, 9)
col2 <- c(2, 4, 5, 9, 8)
col3 <- c(7, 3, 4, 8, 7)
#按列合并向量
my_data <- cbind(col1, col2, col3)
my_data
col1 col2 col3
[1,] 5 2 7
[2,] 6 4 3
[3,] 7 5 4
[4,] 8 9 8
[5,] 9 8 7
# 更改行的名字
rownames(my_data) <- c("row1", "row2", "row3", "row4", "row5")
my_data
col1 col2 col3
row1 5 2 7
row2 6 4 3
row3 7 5 4
row4 8 9 8
row5 9 8 7
cbind():按列组合R对象rbind():按行组合R个对象rownames():检索或设置类似矩阵的对象的行名colnames():检索或设置类似矩阵的对象的列名
如果要转置数据,请使用函数t():
t(my_data)
row1 row2 row3 row4 row5
col1 5 6 7 8 9
col2 2 4 5 9 8
col3 7 3 4 8 7
R的功能nrow()和NcoI位()返回的行和列中存在的数据的数目,分别如下:
ncol(my_data) # 列数
[1] 3
nrow(my_data) # 行数
[1] 5
dim(my_data) # 行列数
[1] 5 3
通过正索引选择行/列
可以按以下方式选择行和/或列:my_data [row,col]
# 输出第二行
my_data[2, ]
col1 col2 col3
6 4 3
# 输出第二到第四行
my_data[2:4, ]
col1 col2 col3
row2 6 4 3
row3 7 5 4
row4 8 9 8
# 输出特定非连续行数
my_data[c(2,4), ]
col1 col2 col3
row2 6 4 3
row4 8 9 8
# 输出第三行
my_data[, 3]
row1 row2 row3 row4 row5
7 3 4 8 7
my_data[2, 3]
[1] 3
按行/列名选择
# 输出第二列内容
my_data[, "col2"]
row1 row2 row3 row4 row5
2 4 5 9 8
也可以对矩阵执行简单的操作。
例如,以下R代码将矩阵的每个元素乘以2:
my_data*2
col1 col2 col3
row1 10 4 14
row2 12 8 6
row3 14 10 8
row4 16 18 16
row5 18 16 14
或者,计算log2值:
log2(my_data)
col1 col2 col3
row1 2.321928 1.000000 2.807355
row2 2.584963 2.000000 1.584963
row3 2.807355 2.321928 2.000000
row4 3.000000 3.169925 3.000000
row5 3.169925 3.000000 2.807355
rowSums()和colSums()函数:分别计算每行的总和和每列的总和。
rowSums(my_data)
row1 row2 row3 row4 row5
14 13 16 25 24
colSums(my_data)
col1 col2 col3
35 28 29
如果你对行/列均值感兴趣,则可以使用函数rowMeans()和colMeans()分别计算行均值和列均值。
apply()的简化格式如下:
apply(X, MARGIN, FUN)
X:数据矩阵
MARGIN:可能的值为1(对于行)和2(对于列)
FUN:应用于行/列的函数
使用apply()如下:
# 对行进行平均值运算
apply(my_data, 1, mean)
row1 row2 row3 row4 row5
4.666667 4.333333 5.333333 8.333333 8.000000
# 队列进行平均值运算
apply(my_data, 2, mean)
col1 col2 col3
7.0 5.6 5.8
2.数据框
数据框就像一个矩阵,但可以具有不同类型的列(数字,字符,逻辑)。行是观察值(个人),列是变量。
2.1 创建一个数据框
可以使用data.frame()函数创建数据框,如下所示:
patients_data <- data.frame(
name = my_patients,
age = patient_ages,
height = c(180, 170, 185, 169),
married = c(T,F,T,T))
# 打印查看
patients_data
name age height married
Zheng Zheng 27 180 TRUE
Wang Wang 25 170 FALSE
Liu Liu 29 185 TRUE
Li Li 26 169 TRUE
要检查数据是否为数据框格式,请使用is.data.frame()函数。如果数据是数据框,则返回TRUE:
is.data.frame(patients_data)
[1] TRUE
is.data.frame(my_data)
[1] FALSE
对象“ patients_data”是一个数据框,但不是对象“ my_data”。我们可以使用as.data.frame()函数将其转换为数据框:
# my_data的类型 --> matrix
class(my_data)
[1] "matrix"
# 将它转换为数据框格式
my_data2 <- as.data.frame(my_data)# Now, the class is data.frame
class(my_data2)
[1] "data.frame"
如矩阵部分所述,你可以使用函数t()转置数据框:
t(patients_data)
要仅从数据框中选择某些列,你可以按名称或按其位置(即第1、2、3列等)引用这些列。
按名称和位置进行正索引
# 访问“名称”列中的数据# 使用$符号
patients_data$name
[1] Zheng Wang Liu Li
Levels: Liu Li Zheng Wang
# 或者使用
patients_data[, 'name']
[1] Zheng Wang Liu Li
Levels: Liu Li Zheng Wang
# 输出第一和第三列
patients_data[ , c(1, 3)]
name height
Zheng Zheng 180
Wang Wang 170
Liu Liu 185
Li Li 169
按特征索引
我们要选择年龄> = 27的所有病人。
patients_data$age >= 27
[1] TRUE FALSE TRUE FALSE
TRUE指定该行包含age> = 27的值。
# 选择符合条件的行
patients_data[patients_data$age >= 27, ]
name age height married
Zheng Zheng 27 180 TRUE
Liu Liu 29 185 TRUE
上面的R代码命令内容为:R从年龄大于等于27的patients_data获取所有行,然后返回所有列。
如果你不想查看所选行的所有列数据,但只想显示例如年龄大于等于27的病人的病人名称和年龄,则可以使用以下R代码:
patients_data[patients_data$age >= 27, c(1, 2)]
name age
Zheng Zheng 27
Liu Liu 29
# 或者patients_data[patients_data$age >= 27, c("name", "age")]
name age
Zheng Zheng 27
Liu Liu 29
如果发现选择语句开始变得不方便,则可以先将行和列选择放入变量中,例如:
age27 <- patients_data$age >= 27
cols <- c("name", "age")
然后,你可以选择带有这些变量的行和列:
patients_data[age27, cols]
name age
Zheng Zheng 27
Liu Liu 29
也可以如下使用函数子集()。
2.3 扩展数据框
在数据框中添加新列
#将组列添加到patient_data
patients_data$group <- patient_groups
patients_data
name age height married group
Zheng Zheng 27 180 TRUE recovered_patient
Wang Wang 25 170 FALSE not_recovered_patient
Liu Liu 29 185 TRUE recovered_patient
Li Li 26 169 TRUE not_recovered_patient
也可以使用函数cbind()和rbind()扩展数据框。
cbind(patients_data, group = patient_groups)
3. 获取帮助
要阅读有关给定功能的更多信息,例如mean,可以如下使用R函数help():
help(mean)
或使用此:
?mean
好了,本期讲解就先到这里。
在之后的更新中,我们会进一步为您介绍R的入门,以及常用生物统计方法和R实现。欢迎关注,投必得医学手把手带您走入R和生物统计的世界。
提前打个预告,接下来我们要正式开始学习R语言的统计学技能啦,下一期将会更新“R的描述性统计分析”。喜欢的同学们快快关注起来吧。
第二讲 R-编程基础-运算、数据类型和向量等基本介绍
当然啦,R语言的掌握是在长期训练中慢慢积累的。一个人学习太累,不妨加入“R与统计交流群”,和数百位硕博一起学习。
快扫二维码撩客服,
带你进入投必得医学交流群,
让我们共同进步!
↓↓
- END -
长按二维码关注「投必得医学」,更多科研干货在等你!
麻烦点一下在看再走呗