R语言统计入门-第一章

第1章 基础知识

1.1 初始步骤

library(ISwR)
#随机抽取1000个符合正态分布的随机数
plot(rnorm(1000))

1.1.3 向量运算

#构建向量
weight <- c(60,72,57,90,95,72)
weight
## [1] 60 72 57 90 95 72
height <- c(1.75,1.80,1.65,1.90,1.74,1.91)
#计算BMI
bmi <- weight/height^2
bmi
## [1] 19.59184 22.22222 20.93664 24.93075 31.37799 19.73630
#计算均值
xbar <- sum(weight)/length(weight)
#计算偏差及其平方及偏差平方和
weight - xbar
## [1] -14.333333  -2.333333 -17.333333  15.666667  20.666667  -2.333333
(weight - xbar)^2
## [1] 205.444444   5.444444 300.444444 245.444444 427.111111   5.444444
sum((weight - xbar)^2)
## [1] 1189.333
#标准差
sqrt(sum((weight - xbar)^2)/(length(weight)-1))
## [1] 15.42293
#其实已经有函数
mean(weight)
## [1] 74.33333
sd(weight)
## [1] 15.42293

1.1.4 标准过程

#单样本t检验,参数mu代表希腊字母μ,表示理论均值,若没有给定,则默认mu=0
t.test(bmi, mu=22.5)
## 
##  One Sample t-test
## 
## data:  bmi
## t = 0.34488, df = 5, p-value = 0.7442
## alternative hypothesis: true mean is not equal to 22.5
## 95 percent confidence interval:
##  18.41734 27.84791
## sample estimates:
## mean of x 
##  23.13262

1.1.5 作图

#若研究体重与身高的关系,第一想法就是作图
plot(height, weight)

#用pch参数修改绘图符号,pch=2为三角形
plot(height, weight,pch=2)
#在图中叠加一个基于BMI为22.5的体重估计曲线
hh <- c(1.65,1.70,1.75,1.80,1.85,1.90)
lines(hh, 22.5*hh^2)

1.2 R语言基础

1.2.3 向量

#字符向量
c("Huey","Dewey","Louie")
## [1] "Huey"  "Dewey" "Louie"
#单引号或双引号都可以
c('Huey','Dewey','louie')
## [1] "Huey"  "Dewey" "louie"

1.2.4 引用和转义序列

#输出一个不带引号的字符串,用cat函数
cat(c("Huey","Dewey","Louie"))
## Huey Dewey Louie
#反斜杠\被称为转移字符。可用\"方式插入引用字符
cat("What is \"R\" ?\n")
## What is "R" ?

1.2.6 生成向量的函数

#c()函数,含义是把各分项首尾连接
c(42,57,12,39,1,3,4)
## [1] 42 57 12 39  1  3  4
#也可以用于连接多于一个元素的向量
x <- c(1,2,3)
y <- c(10,20)
c(x, y, 5)
## [1]  1  2  3 10 20  5
#也可以给某些元素明明
x <- c(red="Huey",blue="Dewey",green="Louie")
#seq()函数,用于建立数字等差序列
seq(4,9)
## [1] 4 5 6 7 8 9
#若间距为2
seq(4,10,2)
## [1]  4  6  8 10
#rep()函数,用来产生重复值
#使用时有两个参数,依赖于第二个参数是想量还是数字,产生的结果也不一样
opps <- c(7,9,13)
rep(opps,3)
## [1]  7  9 13  7  9 13  7  9 13
rep(opps,1:3)
## [1]  7  9  9 13 13 13

1.2.7 矩阵和数组

#用dim()函数设置或改变x的维度
#将一个12个数字的向量改为3*4矩阵
#值得注意的是。矩阵的存储是以列为主,即第二列元素跟在第一列元素后面
x <- 1:12
dim(x) <- c(3,4)
#还可用matrix()函数创建矩阵,byrow=T是将矩阵改成以按行而不是按列形式填充
matrix(1:12, nrow = 3, byrow = T)
##      [,1] [,2] [,3] [,4]
## [1,]    1    2    3    4
## [2,]    5    6    7    8
## [3,]    9   10   11   12
#给行命名
#LETTERS[]特征向量是一个包含大写字母A-Z的内置变量
rownames(x) <- LETTERS[1:3]
x
##   [,1] [,2] [,3] [,4]
## A    1    4    7   10
## B    2    5    8   11
## C    3    6    9   12
#给列命名
colnames(x) <- LETTERS[4:7]
x
##   D E F  G
## A 1 4 7 10
## B 2 5 8 11
## C 3 6 9 12
#将x转置
t(x)
##    A  B  C
## D  1  2  3
## E  4  5  6
## F  7  8  9
## G 10 11 12
#可以按行或按列分别采用cbind和rbind函数将向量粘在一起
cbind(A=1:4,B=5:8,C=9:12)
##      A B  C
## [1,] 1 5  9
## [2,] 2 6 10
## [3,] 3 7 11
## [4,] 4 8 12
rbind(A=1:4,B=5:8,C=9:12)
##   [,1] [,2] [,3] [,4]
## A    1    2    3    4
## B    5    6    7    8
## C    9   10   11   12

1.2.8 因子

#创建数值向量pain,对五个病人的疼痛水平编码
pain <- c(0,3,2,2,1)
#希望把它作为一个分类变量处理
#利用函数factor创建一个因子fpain
#这个函数除了调用pain之外,还有参数levels=0:3,意味着输入的编码使用了3个值0~3
#这个参数可以省略,R默认使用pain中合理排序的值
fpain <- factor(pain,levels = 0:3)
#将水平名称转换为特定的4个字符串
levels(fpain) <- c("none","mild","medium","severe")
fpain
## [1] none   severe medium medium mild  
## Levels: none mild medium severe

1.2.9 列表

#创建11个妇女月经前后能量摄入的向量
intake.pre <- c(5260,5470,5640,6180,6390,6515,6805,7515,7515,8230,8770)
intake.post <- c(3910,4220,3885,5160,5645,4680,5265,5975,6790,6900,7335)
#把单独向量组合成一个列表
mylist <- list(before= intake.pre,after=intake.post)
mylist
## $before
##  [1] 5260 5470 5640 6180 6390 6515 6805 7515 7515 8230 8770
## 
## $after
##  [1] 3910 4220 3885 5160 5645 4680 5265 5975 6790 6900 7335
#列表各部分通过list中使用的参数名称来命名
mylist$before
##  [1] 5260 5470 5640 6180 6390 6515 6805 7515 7515 8230 8770

1.2.10 数据框

#创建数据框,注意数据是成对的
d <- data.frame(intake.pre,intake.post)
d
##    intake.pre intake.post
## 1        5260        3910
## 2        5470        4220
## 3        5640        3885
## 4        6180        5160
## 5        6390        5645
## 6        6515        4680
## 7        6805        5265
## 8        7515        5975
## 9        7515        6790
## 10       8230        6900
## 11       8770        7335
#也可以通过$符号获得
d$intake.pre
##  [1] 5260 5470 5640 6180 6390 6515 6805 7515 7515 8230 8770

1.2.11 索引

#如果需要向量的摸一个具体元素,可以这样
#这个方括号就是索引
intake.pre[5]
## [1] 6390
#也可创建一个包含多于一个数据的子向量
intake.pre[c(3,5,7)]
## [1] 5640 6390 6805
#注意里面的c(3,5,7)是必要的。像下面的就不一样了
#intake.pre[3,5,7]
#负索引,即引用除了某些位置之外的所有元素
intake.pre[-c(3,5,7)]
## [1] 5260 5470 6180 6515 7515 7515 8230 8770

1.2.12 条件选择

#可以通过一个关系表达式选择一些满足某种标准的数据
intake.post[intake.pre > 7000]
## [1] 5975 6790 6900 7335
#寻找经前摄入7000-8000 kj的妇女,停经后的能量摄入
intake.post[intake.pre > 7000 & intake.pre <8000]
## [1] 5975 6790

1.2.13 数据框的索引

d <- data.frame(intake.pre,intake.post)
#寻找第5行。第1列的数据
d[5,1]
## [1] 6390
#寻找第5位妇女的所有数据,注意里面的逗号是必要的,若没有则表示d的第二列构成的数据框
d[5,]
##   intake.pre intake.post
## 5       6390        5645
#查找停经前能量摄入超过70000 kj的妇女
d[d$intake.pre > 7000,]
##    intake.pre intake.post
## 8        7515        5975
## 9        7515        6790
## 10       8230        6900
## 11       8770        7335
#查看d中前几个数据
d[1:2,]
##   intake.pre intake.post
## 1       5260        3910
## 2       5470        4220
#函数head()默认显示前六行
head(d)
##   intake.pre intake.post
## 1       5260        3910
## 2       5470        4220
## 3       5640        3885
## 4       6180        5160
## 5       6390        5645
## 6       6515        4680

1.2.14 分组数据和数据框

#R内置数据集energy,消瘦和肥胖妇女的能量消耗
energy
##    expend stature
## 1    9.21   obese
## 2    7.53    lean
## 3    7.48    lean
## 4    8.08    lean
## 5    8.09    lean
## 6   10.15    lean
## 7    8.40    lean
## 8   10.88    lean
## 9    6.13    lean
## 10   7.90    lean
## 11  11.51   obese
## 12  12.79   obese
## 13   7.05    lean
## 14  11.85   obese
## 15   9.97   obese
## 16   7.48    lean
## 17   8.79   obese
## 18   9.69   obese
## 19   9.68   obese
## 20   7.58    lean
## 21   9.19   obese
## 22   8.11    lean
#有时候希望每一组有一个独立的向量来存储数据
exp.lean <- energy$expend[energy$stature == "lean"]
exp.lean
##  [1]  7.53  7.48  8.08  8.09 10.15  8.40 10.88  6.13  7.90  7.05  7.48
## [12]  7.58  8.11
exp.obese <- energy$expend[energy$stature == "obese"]
exp.obese
## [1]  9.21 11.51 12.79 11.85  9.97  8.79  9.69  9.68  9.19
#也可以通过split函数,它根据分组生成一系列向量
l <- split(energy$expend, energy$stature)
l
## $lean
##  [1]  7.53  7.48  8.08  8.09 10.15  8.40 10.88  6.13  7.90  7.05  7.48
## [12]  7.58  8.11
## 
## $obese
## [1]  9.21 11.51 12.79 11.85  9.97  8.79  9.69  9.68  9.19

1.2.15 隐式循环

#计算数值向量组成的数据框中每个变量的均值
#lapply函数返回一个列表
lapply(thuesen, mean, na.rm =T)
## $blood.glucose
## [1] 10.3
## 
## $short.velocity
## [1] 1.325652
#sapply函数尽可能将结果简化成矢量或矩阵
sapply(thuesen, mean, na.rm =T)
##  blood.glucose short.velocity 
##      10.300000       1.325652
#apply函数。可以针对矩阵的行或列(或广义下多维数组的下标)
#对于矩阵而言,apply函数中的参数2,表示按列,若为1,则表示按行,若为c(1,2)则表示行和列
#下面表示按列取最小值
m <- matrix(rnorm(12),4)
apply(m, 2, min)
## [1] -1.9068416 -0.7393233 -1.3446173

1.2.16 排序

#使用sort()函数
intake$post
##  [1] 3910 4220 3885 5160 5645 4680 5265 5975 6790 6900 7335
sort(intake$post)
##  [1] 3885 3910 4220 4680 5160 5265 5645 5975 6790 6900 7335
Avatar
Dr.二哈
在读苦逼科研狗

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