R语言中包括哪些数据结构? r语言基本数据结构
lipiwang 2024-10-28 17:24 9 浏览 0 评论
在大多数情况下,结构化的医学数据是一个由很多行和很多列组成的数据集。在R中,这种数据集被称为数据框。在学习数据框之前,我们先来认识一些用于存储数据的数据结构:向量、因子、矩阵、数组和列表。这些数据结构在存储类型、创建方式和操作方式等方面均有所不同,熟悉它们的基本概念和操作技巧,将会让我们能够灵活高效地处理数据。
2.1.1 向量
向量(vector)是用于存储数值型、字符型、逻辑型数据的一维数组。标量可以看作是只含有一个元素的向量。函数c( )可用来创建向量,例如:
> x1 <- c(2, 4, 1, -2, 5)
> x2 <- c("one", "two", "three")
> x3 <- c(TRUE, FALSE, TRUE, FALSE)
这里x1是数值型向量,x2是字符型向量,而x3是逻辑型向量。每一个向量中的数据类型必须一致。如果想创建有规律的向量,R提供了一些简便的操作和函数,例如:
> x4 <- 1:5 # 等价于x4 <- c(1, 2, 3, 4, 5)
> x5 <- seq(from = 2, to = 10, by = 2) # 等价于x5 <- c(2, 4, 6, 8, 10)
> x6 <- rep("a", times = 4) # 等价于x6 <- c("a", "a", "a", "a")
有时候我们只想使用向量中的某个部分,即选取向量的子集。假设有一个从3到100的步长为7的整数向量,那么第5个数的值是多少呢?
> x <- seq(from = 3, to = 100, by = 7)
> x
[1] 3 10 17 24 31 38 45 52 59 66 73 80 87 94
请注意,向量x的最后一个数并不是100而是94,因为94再加一个步长7,结果就将超过100了。
> x[5]
[1] 31
在方括号“[ ]”中的数字被称为下标,它指定向量的索引位置。在上面的命令里,x[5]表示向量的第5个元素,其值为31。下面的命令显示向量的第4、第6和第7个元素:
> x[c(4, 6, 7)]
[1] 24 38 45
下标中的向量可以取负值,表示去除指定位置上的元素。例如,要去掉x的前4个元素,可以输入下面的代码(注意命令里的括号):
> x[-(1:4)]
[1] 31 38 45 52 59 66 73 80 87 94
R中的运算都是向量化的,例如:
> weight <- c(68, 72, 57, 90, 65, 81)
> height <- c(1.75, 1.80, 1.65, 1.90, 1.72, 1.87)
> bmi <- weight / height ^ 2
> bmi
[1] 22.20408 22.22222 20.93664 24.93075 21.97134 23.16337
在上面计算bmi的过程中,运算符“^”被循环使用了,所以计算的结果仍然是一个向量。如果参与运算的向量的长度不一致,R会自动补全后计算,同时给出警告信息。
> a <- 1:5
> b <- 1:3
> a + b
[1] 2 4 6 5 7
Warning message:
In a + b : longer object length is not a multiple of shorter object length
上面向量a的长度为5,向量b的长度为3。在计算a + b时,因为向量b的长度比向量a的短,所以向量b会从第一个元素开始循环使用。因此,在最后的输出中,a中的第四个元素4加上了b的第一个元素1,a中的第五个元素5加上了b的第二个元素2。
R提供了种类繁多的计算统计量的函数,常用的统计函数见表2-1。用这些函数计算向量的统计量非常方便。下面这段代码演示了其中的几个函数作用于向量bmi后的输出结果。
> length(bmi) # 计算向量bmi的长度
[1] 6
> mean(bmi) # 计算向量bmi的均值
[1] 22.5714
> var(bmi) # 计算向量bmi的样本方差
[1] 1.841265
> sd(bmi) # 计算向量bmi的样本标准差
[1] 1.356932
表2-1 常用的统计函数
2.1.2 因子
一般来说,变量有数值型、名义型和有序型之分。名义型变量是没有顺序关系的分类变量,例如人的性别、血型、民族等。而有序型变量是有层级和顺序关系的分类变量,如患者的病情(较差、好转、很好)。名义型变量和有序型变量在R中称为因子(factor)。因子在R中非常重要,它决定了数据的展示和分析方式。数据存储时因子经常以整数向量形式存储。所以在进行数据分析之前,经常需要将它们用函数factor( )转换为因子。例如:
> sex <- c(1, 2, 1, 1, 2, 1, 2)
> sex.f <- factor(sex, levels = c(1, 2), labels = c("Male", "Female"))
> sex.f
[1] Male Female Male Male Female Male Female
Levels: Male Female
上面的命令先定义了一个变量sex表示性别,假设其取值1表示男性,2表示女性。接着用函数factor( )将变量sex转换成了因子并存为对象sex.f,其中参数levels表示原变量的分类标签值,参数labels表示因子取值的标签。注意,这两个参数在赋值时需要一一对应,R会将它们相关联。因子型变量与一般的字符型变量的区别就是它有一个水平(level)属性。因子的属性可以使用函数levels( )查看:
> levels(sex.f)
[1] "Male" "Female"
在统计模型中,对于因子型变量,R会将其第一个水平当作参考组。很多时候我们需要改变因子水平的排列顺序以改变参考组,这可以通过两种方法实现。第一种方法是在函数factor( )中改变参数levels和labels的排列顺序,例如:
> sex.f1 <- factor(sex, levels = c(2, 1), labels = c("Female", "Male"))
> sex.f1
[1] Male Female Male Male Female Male Female
Levels: Female Male
第二种方法是使用函数relevel( ):
> sex.f1 <- relevel(sex.f, ref = "Female")
> sex.f1
[1] Male Female Male Male Female Male Female
Levels: Female Male
要表示有序因子,需要在函数factor( )里指定参数ordered = TRUE。例如:
> status <- c(1, 2, 2, 3, 1, 2, 2)
> status.f <- factor(status,
levels = c(1, 2, 3),
labels = c("Poor", "Improved", "Excellent"),
ordered = TRUE)
> status.f
[1] Poor Improved Improved Excellent Poor Improved Improved
Levels: Poor < Improved < Excellent
2.1.3 矩阵
矩阵(matrix)是一个由行和列组成的二维数组。矩阵里的每个元素具有相同的模式(数值型、字符型或逻辑型)。在大多数情况下,矩阵里的元素是数值型的,它具有很多数学特性和运算方式,可以用来进行统计计算,例如因子分析、广义线性模型等。函数 matrix( )常用于创建矩阵,例如:
> M <- matrix(1:6, nrow = 2)
> M
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
上面的命令用向量1到6创建了一个行数为2的矩阵,R会根据向量的长度和参数nrow设定的行数自动计算列数。参数byrow默认为FALSE,即按列将数值进行排列,如果需要按行排列,只需将参数byrow设为TRUE。
常见的矩阵运算都可以在R中实现,如矩阵加法、矩阵乘法、求逆矩阵、矩阵转置、求方阵的行列式、求方阵的特征值和特征向量等。
矩阵乘法中要求第一个矩阵的列数等于第二个矩阵的行数,其运算符为“%*%”。先创建两个矩阵:
> mat1 <- matrix(1:6, nrow = 3)
> mat1
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> mat2 <- matrix(5:10, nrow = 2)
> mat2
[,1] [,2] [,3]
[1,] 5 7 9
[2,] 6 8 10
函数dim( )可以得到矩阵的维数,即行数和列数:
> dim(mat1)
[1] 3 2
> dim(mat2)
[1] 2 3
结果表明,mat1是一个3行2列的矩阵,mat2是一个2行3列的矩阵,因此它们可以相乘,结果应该是一个3行3列的矩阵。
> mat1 %*% mat2
[,1] [,2] [,3]
[1,] 29 39 49
[2,] 40 54 68
[3,] 51 69 87
矩阵的转置运算就是把矩阵的行和列互换。例如,求矩阵mat1的转置矩阵:
> t(mat1)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
求方阵的行列式和逆矩阵分别可以使用函数det( )和函数solve( )实现,例如:
> mat3 <- matrix(1:4, nrow = 2)
> det(mat3)
[1] -2
> solve(mat3)
[,1] [,2]
[1,] -2 1.5
[2,] 1 -0.5
此外,我们还可以对矩阵按行、列求和或者求平均,例如:
> rowSums(mat1)
[1] 5 7 9
> colSums(mat1)
[1] 6 15
> rowMeans(mat1)
[1] 2.5 3.5 4.5
> colMeans(mat1)
[1] 2 5
与矩阵运算有关的函数在此无法一一详述,读者有需要时可以通过查阅CRAN的相关文档了解更多矩阵运算函数用法的细节。
使用索引访问矩阵元素也是矩阵的基本操作,与向量类似,我们可以用“[]”来索引访问矩阵中的元素。不同的是,对于矩阵,在“[ ]”中需要用逗号分隔行号和列号。例如,选取矩阵mat1的前两行和前两列,可以使用下面的命令:
> mat1[1:2, 1:2]
[,1] [,2]
[1,] 1 4
[2,] 2 5
如果省略了行号或列号,则表示选取所有行或者所有列,例如:
> mat1[2:3,]
[,1] [,2]
[1,] 2 5
[2,] 3 6
2.1.4 数组
通常所说的数组(array)指的是多维数组,它与矩阵类似,但是维数大于2。数组有一个特殊的维数(dim)属性。下面的命令给一个向量加上维数后定义了一个数组,请注意数值的排列顺序。
> A <- 1:24
> dim(A) <- c(3, 4, 2)
> A
, , 1
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
, , 2
[,1] [,2] [,3] [,4]
[1,] 13 16 19 22
[2,] 14 17 20 23
[3,] 15 18 21 24
上面的数组还可以通过函数array( )创建,并给各个维度添加名称和标签。
> dim1 <- c("A1", "A2", "A3")
> dim2 <- c("B1", "B2", "B3", "B4")
> dim3 <- c("C1", "C2")
> array(1:24, dim = c(3, 4, 2), dimnames = list(dim1, dim2, dim3))
, , C1
B1 B2 B3 B4
A1 1 4 7 10
A2 2 5 8 11
A3 3 6 9 12
, , C2
B1 B2 B3 B4
A1 13 16 19 22
A2 14 17 20 23
A3 15 18 21 24
2.1.5 列表
列表(list)是R中最灵活也最复杂的一种数据结构,它可以由不同类型的对象混合组成。例如,它可以是向量、数组、表格和任意类型对象的组合。
> list1 <- list(a = 1, b = 1:5, c = c("red", "blue", "green"))
> list1
$a
[1] 1
$b
[1] 1 2 3 4 5
$c
[1] "red" "blue" "green"
注意,函数list( )的参数由一系列新对象组成,这些对象从现有对象或值中分配值。显示列表时,每个新对象名都以符号“$”作为前缀。
在普通的数据分析中,创建列表并不是一项常见的任务。但是,很多函数的返回值是一个列表。例如:
> set.seed(123)
> dat <- rnorm(10)
> bp <- boxplot(dat)
> class(bp)
[1] "list"
上面的命令用函数rnorm( )从标准正态分布中生成了一个由10个数组成的随机样本。为了使结果具有可重复性,我们在该命令前用函数set.seed( )设置了生成随机数的种子。如果不设定种子,每次显示的结果很可能不同。然后,用函数boxplot( )对这个随机样本作箱线图,并把结果保存为bp。函数class( )用于查看对象的类型,这里bp是一个列表。查看这个列表里面的内容:
> bp
$stats
[,1]
[1,] -1.26506123
[2,] -0.56047565
[3,] -0.07983455
[4,] 0.46091621
[5,] 1.71506499
$n
[1] 10
$conf
[,1]
[1,] -0.5901626
[2,] 0.4304935
$out
numeric(0)
$group
numeric(0)
$names
[1] "1"
这里列表bp包含了多个对象,如果想查看或使用某一个对象,只需用“$”符号引用。例如,要查看列表bp中的对象stats的内容,可以输入:
> bp$stats
[,1]
[1,] -1.26506123
[2,] -0.56047565
[3,] -0.07983455
[4,] 0.46091621
[5,] 1.71506499
2.1.6 数据框
数据框(dataframe)是一个由行和列组成的二维结构,其中行表示观测(observation)或记录(record),列表示变量(variable)或指标(indicator)。数据框与Excel、SAS和SPSS中的数据集类似。数据框看起来与矩阵很相似,而且矩阵的很多操作也适用于数据框,如子集的选择。与矩阵不同的是,数据框里不同的列可以是不同模式(数值型、字符型等)的数据。数据框可以通过函数data.frame( )创建。例如,下面的代码创建了一个包含5个观测对象、4个变量的数据框:
> ID <- 1:5
> sex <- c("male", "female", "male", "female", "male")
> age <- c(25, 34, 38, 28, 52)
> pain <- c(1, 3, 2, 2, 3)
> pain.f <- factor(pain,
+ levels = 1:3,
+ labels = c("mild", "medium", "severe"))
> patients <- data.frame(ID, sex, age, pain.f)
> patients
ID sex age pain.f
1 1 male 25 mild
2 2 female 34 severe
3 3 male 38 medium
4 4 female 28 medium
5 5 male 52 severe
数据框本质上也是一种列表,要显示或使用数据框的某一变量(列),可以使用“$”符号加上变量名。例如:
> patients$age
[1] 25 34 38 28 52
> mean(patients$age)
[1] 35.4
大部分结构化的医学数据集均以数据框的形式呈现,因此,数据框是本书中最常处理的数据结构。关于数据框的操作将在第3章中详细讨论。
2.1.7 数据类型的转换
在进行数据分析时,分析者需要对数据的类型熟稔于心,因为数据分析方法的选择与数据的类型是有密切联系的。R提供了一系列用于判断某个对象的数据类型的函数,还提供了将某种数据类型转换为另一种数据类型的函数。这些函数都存在于基本包base里,表2-2列出了其中的一部分常用函数。
表2-2 数据类型的判断与转换函数
以“is.”开头的函数的返回值为TRUE或FALSE,而以“as.”开头的函数将对象转换为相应的类型。例如:
> x <- c(2, 5, 8)
> is.numeric(x)
[1] TRUE
> is.vector(x)
[1] TRUE
> y <- as.character(x)
> y
[1] "2" "5" "8"
> is.numeric(y)
[1] FALSE
> is.character(y)
[1] TRUE
> z <- c(TRUE, FALSE, TRUE, FALSE)
> is.logical(z)
[1] TRUE
> as.numeric(z)
[1] 1 0 1 0
本文摘自《 R语言医学数据分析实战》
- 医学统计学入门,华中科技大学同济医学院余松林教授作序推荐
- 强调实战和应用,突出问题本质和整体结构
- 包含大量的R程序示例和图形,带你更深入地理解数据分析
本书共分为14章,第1章~第3章介绍了R语言的基本用法;第4章介绍了数据可视化;第5章介绍了基本的统计分析方法;第6章~第8章介绍了医学研究中最常用的三种回归模型;第9章介绍了生存分析的基本方法;第10章~第12章介绍了几种常用的多元统计分析方法;第13章介绍了临床诊断试验的统计评价指标和计算方法;第14章介绍了在医学科研实践中常用的Meta分析方法。
本书适用于临床医学、公共卫生及其他医学相关专业的本科生和研究生使用,亦可作为其他专业的学生和科研工作者学习数据分析的参考书。阅读本书,读者不仅能掌握使用R及相关包快速解决实际问题的方法,还能更深入地理解数据分析。
相关推荐
- 想减少Windows 11内存占用?请取消固定Teams
-
如果你想要提高Windows11系统的运行速度,那么可以禁用某些默认启用的功能和设置。如果你的Windows11是安装在已经停止支持的设备或者内存容量不高的旧设备,那么应该立即限制或禁用固...
- Windows查看端口占用、查看PID对应的进程、并终止进程
-
Windows下:查看端口占用netstat-ano|findstr"端口号"获取到pid查看PID对应的进程tasklist|findstr"进程ID"...
- 计算机组成原理(36): 分时之一——进程
-
建立一个虚拟机VM目标:给每个程序一个自己的虚拟机“VirtualMachine”,程序并不知道其他的虚拟机。1.1进程(Process)为了捕获正在运行的程序,我们创建一个称为“进程(Proce...
- window系统如何停止端口被占用的进程(高手版)
-
如上图1,作为开发人员是不是经常遇到这个问题?(Webserverfailedtostart.Port9527wasalreadyinuse.)当然,如果在你知道确实有某个进程正占...
- 电脑的文件无法删除咋回事?你需要这款神兵利器
-
很多朋友用电脑的时候,都遇到过文件无法删除的情况。这往往是由于文件被某个软件、进程所调用所引发的——在Windows中,某个文件如果被使用,这个文件可能就没法进行删除、重命名之类的操作了。想要进一步操...
- Windows日志分析(windows 日志文件)
-
1.Windows日志文件简介1.1Windows日志核心分类1.系统日志系统日志包含由Windows系统组件记录的事件,记录系统进程和设备驱动程序的活动。由它审核的系统事件包括启动失败的设备驱动程...
- 电脑软件崩溃、闪退不用慌!DJS Tech 教你几招轻松解决
-
当你正全神贯注用电脑处理重要文件、沉浸在精彩的游戏世界,或是观看喜欢的视频时,软件突然崩溃、闪退,那一刻的烦躁简直难以言喻。别着急,DJSTech作为深耕计算机领域多年的专业团队,为你带来一系列超...
- 微软Win11推进淘汰控制面板,时间服务器配置迁移至设置应用
-
IT之家5月29日消息,科技媒体Winaero昨日(5月28日)发布博文,报道称微软在Windows11系统中,继续推进“淘汰控制面板”进程,配置时间服务器地址选项迁移到设置应...
- 微软 PowerToys更新,可帮你找出 Win11上哪些进程正在占用该文件
-
IT之家11月3日消息,微软针对Windows11和Windows10的PowerToys已经更新到了最新的0.64.0版本,并上线了一个名为“文件锁匠FileLock...
- Windows基础操作 认识任务管理器(windows任务管理器的使用)
-
Windows基础操作:认识任务管理器任务管理器(TaskManager)是Windows系统中一个功能强大的实用工具,它为用户提供了实时监控系统资源、管理正在运行的程序和服务的能力。掌握任务管理器...
- windows——netstat过滤(终止进程)
-
windows——netstat过滤(终止进程)在Windows操作系统中,使用netstat命令可以查看网络连接的状态。要过滤特定协议或端口的连接,可以使用以下命令:查看所有连接:netstat-...
- 只要这么做 Windows Defender与第三方就能和平共存啦
-
无论大家是否喜欢WindowsDefender,伴随着Windows10的不断升级,它已经成为系统的底层必备组件之一。虽然我们有各种各样的方法去关闭它,换用顺手的第三方,但只要更新打补丁,噩梦就来...
- Win10如何彻底关闭wsappx进程(win10 wsappx怎么关闭)
-
win10如何彻底关闭wsappx进程?wsappx进程是什么?wsappx进程是Windows10系统的一部分,这个进程是WindowsStore和微软通用应用程序平台(UWP)的依赖进程。...
- Windows环境黑客入侵应急与排查(黑客入侵电脑原理)
-
1文件分析1.1临时目录排查黑客往往可能将病毒放在临时目录(tmp/temp),或者将病毒相关文件释放到临时目录,因此需要检查临时目录是否存在异常文件。假设系统盘在C盘,则通常情况下的临时目录如下...
- Windows 11 24H2 KB5044384出现大面积安装失败、任务管理器0进程等问题
-
Windows11KB5044384更新由于出现大量错误而无法在Windows1124H2上安装、其中包括一个奇怪的错误,即由于0x800f0922、0x800736b3和0x8...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)