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