R语言统计分析与应用-第二章-1

写在前面的话,R语言统计分析与应用这本书的第一章是讲的怎么下载与安装R,这里就不再赘述了。下面开始第二章。 这本书我决定不再像之前那本书一样,照着书上写,这本书会加入自己的吐槽,只不过在代码上保持一致。 # 第二章 R编程入门 在学习R的时候,总会发现,自己编写一些函数还是比较爽的。在介绍编程之前,首先回顾下R的基础知识。 ## 2.1.1 数据集的概念 这个数据集,对于R语言而言非常重要,在我日常处理的时候,往往因为数据集的问题而导致R报错。看来基础知识还是要掌握地扎实才可以。 1. 向量 这个是R组基础的东西了,是一系列元素的组合,可以存储数值型、字符型或者逻辑型的数据。

#创建一个向量
#数值型
a <- c(1,2,3,4,10,-9,20)
#字符型
b <- c("one", "two", "three")
#逻辑型
c <- c(TRUE, FALSE, TRUE, TRUE, FALSE, FALSE)
#字符型
d <- c("a", "a", "b", "b", "c")

有的时候想查询某个向量中的某个元素,可以这样做:

d <- c(1,3,5,9,7,10,23,21,17)
#查询第二个元素
d[2]
## [1] 3
#查询第二到第五个元素
d[2:5]
## [1] 3 5 9 7
#查询某几个元素
d[c(1,2,6,7)]
## [1]  1  3 10 23
  1. 矩阵 矩阵就是线性代数里的概念,是个二维数组,每个元素是相同的类型(同为数值、同为字符或者同为逻辑),可通过函数matrix创建。
#创建一个4行,5列的矩阵,数值排列为按列
x <- matrix(21:40, nrow = 4, ncol = 5, byrow = FALSE)
x
##      [,1] [,2] [,3] [,4] [,5]
## [1,]   21   25   29   33   37
## [2,]   22   26   30   34   38
## [3,]   23   27   31   35   39
## [4,]   24   28   32   36   40
#创建一个含有列名标签的矩阵,并按行排列数值
fourcell <- c(1,2,3,10,20,30)
rnames <- c("R1", "R2")
cnames <- c("C1", "C2", "C3")
mymatrix <- matrix(fourcell, nrow = 2, ncol = 3, byrow = TRUE,
                   dimnames = list(rnames, cnames))
mymatrix
##    C1 C2 C3
## R1  1  2  3
## R2 10 20 30
#创建一个含有列名标签的矩阵,并按列排列数值
mymatrix1 <- matrix(fourcell, nrow = 2, ncol = 3, byrow = FALSE,
                   dimnames = list(rnames, cnames))
mymatrix1
##    C1 C2 C3
## R1  1  3 20
## R2  2 10 30

类似于向量,矩阵也可以用类似的方式查询某行某列的元素。 不过要从向量的一维推广到矩阵的二维。

aa <- matrix(1:20, nrow = 5)
aa
##      [,1] [,2] [,3] [,4]
## [1,]    1    6   11   16
## [2,]    2    7   12   17
## [3,]    3    8   13   18
## [4,]    4    9   14   19
## [5,]    5   10   15   20
#查询第三行
aa[3,]
## [1]  3  8 13 18
#查询第三列
aa[,3]
## [1] 11 12 13 14 15
#查询第三行的第三、第四列元素
aa[3,c(3,4)]
## [1] 13 18
#查询第三行第三列元素
aa[3,3]
## [1] 13
#查询第三、第四列元素
aa[,c(3,4)]
##      [,1] [,2]
## [1,]   11   16
## [2,]   12   17
## [3,]   13   18
## [4,]   14   19
## [5,]   15   20
  1. 数组 矩阵只能是二维的,这是必须的~,而要创建2维以上的,则要用到数组了创建函数是array(vector, dimensions, dimnames),其中的参数vector是数组中的数据,dimensions是一个数值型向量,给出了各个维度下标的最大值,而dimnames则是各维度名称的列表。
dim1 <- c("X1", "X2")
dim2 <- c("Y1", "Y2", "Y3")
dim3 <- c("Z1", "Z2", "Z3", "Z4")
#这个数组中c(4,3,2)代表着,与dimnames对应,dim3最多有4个数值,dim2最多有3个数值,dim1最多有2个数值
xyz <- array(1:24, c(4,3,2), dimnames = list(dim3, dim2, dim1))
xyz
## , , X1
## 
##    Y1 Y2 Y3
## Z1  1  5  9
## Z2  2  6 10
## Z3  3  7 11
## Z4  4  8 12
## 
## , , X2
## 
##    Y1 Y2 Y3
## Z1 13 17 21
## Z2 14 18 22
## Z3 15 19 23
## Z4 16 20 24

数组的查询方式与矩阵类似。为方便理解,将X定义为“长”,Y定义为“宽”,Z则定义为“高”.

#查询高下标为1,宽下标为2的元素
xyz[1,2,]
## X1 X2 
##  5 17
#查询高下标为1,宽下标为3的元素
xyz[1,3,]
## X1 X2 
##  9 21
#查询宽下标为2,长下标为2的元素
xyz[,2,2]
## Z1 Z2 Z3 Z4 
## 17 18 19 20
#查询高下标为3,宽下标为2,长下标为1的元素
xyz[3,2,1]
## [1] 7
  1. 数据框 这个数据框与SPSS中看到的数据集类似。不同的列可以包含不同类型的元素(数值型、字符型等)。这也是R中最常见的数据结构。有些时候,矩阵不够用的情况下,这个数据框就会起很大作用。
IDnumber <- c(101,102,103,104)
age <- c(24,78,56,45)
hypertention <- c("yes", "no", "no", "yes")
severity <- c("high", "middle", "low", "middle")
patientdata <- data.frame(IDnumber, age, hypertention, severity)
patientdata
##   IDnumber age hypertention severity
## 1      101  24          yes     high
## 2      102  78           no   middle
## 3      103  56           no      low
## 4      104  45          yes   middle

在数据框中选取元素可以用很多种方式,既可以用矩阵、数组的下标方法,也可以直接指定列名。

#查询第一列也就是IDnumber
patientdata[1]
##   IDnumber
## 1      101
## 2      102
## 3      103
## 4      104
#查询第一列以及第二列,也就是IDnumber和age
patientdata[1:2]
##   IDnumber age
## 1      101  24
## 2      102  78
## 3      103  56
## 4      104  45
#查询age这一列
patientdata["age"]
##   age
## 1  24
## 2  78
## 3  56
## 4  45
#查询age和severity
patientdata["age", "sverity"]
## NULL
#查询age中的元素
patientdata$age
## [1] 24 78 56 45

这个“$”符号是比较常用的使用方法,它被用来选取一个给定数据框的某个特定变量。也可以联合使用attach()和detach()函数,或者单独使用with()函数来简化代码……

书上是这么说的,但我觉得,“$”这个符号在日后阅读代码时比较好理解。

attach()函数可以将数据框添加到R的搜索路径中。而detach()函数将数据框从搜索路径中移除。下面的代码获取年龄(age)变量的描述性统计,并分别绘制age变量与收缩压(hypertention)的散点图。

systolic <- c(120,130,140,150,160)
age <- c(20,30,40,50,55)
hypertention <- data.frame(systolic, age)
hypertention
##   systolic age
## 1      120  20
## 2      130  30
## 3      140  40
## 4      150  50
## 5      160  55
summary(hypertention$age)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##      20      30      40      39      50      55
summary(hypertention$systolic)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     120     130     140     140     150     160
plot(hypertention$age, hypertention$systolic)

#上面代码也可以简化为
attach(hypertention)
## The following objects are masked _by_ .GlobalEnv:
## 
##     age, systolic
summary(age)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##      20      30      40      39      50      55
summary(systolic)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     120     130     140     140     150     160
plot(systolic, age)
detach(hypertention)
#或者
with(hypertention,{
  summary(age)
  summary(systolic)
  plot(systolic, age)
})

但是with()函数有一个特殊情况需要注意,如果出现with()里要对某个不在原数据框中的变量赋值,那这个变量若不注意赋值格式,则会出现下面的问题。

with(hypertention, {
  stat <- summary(age)
  stat
})
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##      20      30      40      39      50      55
#这个时候如果输入stat,则会出现“找不到对象‘stat’”

这个问题就出在赋值符号<-上,如果要创建在with()结构以外存在的对象,则要用“<<-”符号代替“<-”。这样,这个对象就可以保存在with()之外的全局环境中。

with(hypertention, {
  stat <<- summary(age)
})
#这个时候stat就成为全局变量了
stat
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##      20      30      40      39      50      55
Avatar
Dr.二哈
在读苦逼科研狗

研究方向:脂质营养,业余时间自学R。

相关