查看原文
其他

第三讲 R编程基础-矩阵和数据框

跟我学 投必得医学 2022-05-07

在“R与生物统计专题”中,我们会从介绍R的基本知识展开到生物统计原理及其在R中的实现。以从浅入深,层层递进的形式在投必得医学公众号更新。


在上一讲中,我们介绍了第二讲 R-编程基础-运算、数据类型和向量等基本介绍(戳这里即可跳转)相信大家对R语言的基础知识已经有了一定的了解。


今天的更新,我们会带您学习R编程基础——矩阵和数据框,今天的主要内容如下。



1. 矩阵


矩阵就像Excel的工作表。它用于组合具有相同类型的向量,可以是数字,字符或逻辑。矩阵用于将数据表存储在R中。


1.1 创建和命名矩阵

要轻松创建矩阵,请使用函数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

1.2 矩阵尺寸

R的功能nrow()和NcoI位()返回的行和列中存在的数据的数目,分别如下:

ncol(my_data) # 列数

[1] 3

nrow(my_data) # 行数

[1] 5

dim(my_data) # 行列数

[1] 5 3

1.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

1.3 矩阵计算

也可以对矩阵执行简单的操作

例如,以下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()分别计算行均值和列均值。

✎ Tip 


请注意,也可以使用函数apply()将任何统计函数应用于矩阵的行/列。

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的类型 --> matrixclass(my_data)

[1] "matrix"

# 将它转换为数据框格式my_data2 <- as.data.frame(my_data)# Now, the class is data.frameclass(my_data2)

[1] "data.frame"

矩阵部分所述,你可以使用函数t()转置数据框:

t(patients_data)


2.2 子集数据框


✎ Tip 

要仅从数据框中选择某些列,你可以按名称或按其位置(即第1、2、3列等)引用这些列。
  1. 按名称和位置进行正索引

# 访问“名称”列中的数据# 使用$符号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

  1. 按特征索引

我们要选择年龄> = 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 >= 27cols <- c("name", "age")

然后,你可以选择带有这些变量的行和列:

patients_data[age27, cols]

name age

Zheng Zheng  27

Liu Liu  29


也可以如下使用函数子集()。


2.3 扩展数据框

在数据框中添加新列

#将组列添加到patient_datapatients_data$group <- patient_groupspatients_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语言的掌握是在长期训练中慢慢积累的。一个人学习太累,不妨加入“R与统计交流群”,和数百位硕博一起学习。


快扫二维码撩客服,

带你进入投必得医学交流群,

让我们共同进步!

↓↓


- END -


长按二维码关注「投必得医学」,更多科研干货在等你!


麻烦点一下在看再走呗

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存