R学习笔记03
title: “R的学习笔记03”
author: “ks_c”
date: “2021/1/29”
output: html_document
昨日在bookdown网站上看到一本书R数据分析指南与速查手册,看起来挺不错,奈何网络奇差,每次打开bookdown网站时都花费不少时间,又无法直接下载,故在阅读过程中做记录于此。后时若用到,则不必费力再登陆彼网站。
郭晓,R 数据分析指南与速查手册,bookdown.org
以下为第一章的内容。
1. 快捷键
- 脚本编辑窗口:
- 新建脚本:Ctrl+Shift+N
- 代码提示与补全:Tab
- 注释或取消注释:Ctrl+Shift+C
- 运行所选代码:Ctrl+Enter
- 运行全部代码:Ctrl+Shift+Enter
- 全选:Ctrl+A
- 选择:Shift+箭头
- 删除行:Ctrl+D
- 撤销:Ctrl+Z
- 重做:Ctrl+Shift+Z
- 赋值符:Alt±
- 代码折叠:Alt+L
- 代码展开:Shift+Alt+L
- 保存本脚本:Ctrl+S
- 保存全部脚本:Ctrl+Alt+S
- 增加缩进:选中代码后,Tab(可包括多行)
- 减小缩进:选中代码后,Shift+Tab
- 智能缩进:选中代码后,Ctrl+I
- 智能缩进加智能空格:Ctrl+Shift+A(更高级的代码格式规范化工具,可参考formatR包)
- 选择与替换:Ctrl+F
- 提取函数:Ctrl+Alt+X(RStudio 可以分析某一代码段,并自动将其转换成一个可- 重复使用的函数。任何在选择的代码内的“自由的”变量,即那些被引用但没有被创建的变量,将被转化为函数的参数)
- 命令窗口中:
- 历史中的上一条命令:向上箭头
- 历史中的下一条命令:向下箭头
- 中断运行的代码:Esc
- 清除命令窗口中的内容:Ctrl+L
2.常见运算符
运算符 | 含义 |
---|---|
[ ] [[ ]] | 索引(关于两者之间差异请见这篇笔记 ) |
:: ::: | 使用名称访问变量(一般使用: : ) |
$ @ | 元素提取、位置提取(更常用$) |
^ | 乘方 |
- + | 负、正 |
: | 创建数列(x<-c(1:10)#创建1到10的一个数列 ) |
%任意% | 特殊运算符 |
a%in%b #判断a是否在b中,返回T or F | |
%>% 管道符号,见这里 | |
* / | 乘、除 |
+ - | 加、减 |
==、!=、<、>、<=、>= | 比较运算符 |
! | 逻辑非 |
&、&& | 逻辑与 |
I (竖线,enter上遍的键那个) | 逻辑或 |
~ | 非,与!=等价 |
-> 、->> | 向右赋值 |
= | 赋值(右边变量的值给左边变量) |
<- 、<<- | 赋值(同上) |
? | 帮助 |
3. 关于换行
分号; 一行执行多条命令(谁会用呢)
我今天用了三次……
a <- 1;b <- 2
a
[1] 1
b
[1] 2
paste0( )函数:来凝结多行字符串:
string1 <- "this is a long string
+ with a ‘\n’ "
[1] "this is a long string \nwith \n"
#如果赋值时直接在字符串中分行,那么最终会出现一个换行符"\n"
a <- paste0('this is the first line ',
+ 'this is the second line')
a
[1] "this is the first line this is the second line"
#如果用paste0()函数则不会出现
paste()和paste0()之间的区别在于:
paste(…, collapse ="" , recycle0 =F)
paste(…, sep="", collapse ="" , recycle0 =F)函数中多了一个sep参数,用来设置分隔符。
4. ifelse控制语句
类似Excel中的=if()函数。
在Excel中,=if(条件,值为T则,值为F则),在Rstudio中可以用ifelse()函数实现。
x <- c(6:-4)
y <- sqrt(ifelse(x >= 0, x, NA))#如果x大于0,那么就取x的值进行计算,否则就是NA。
x
[1] 6 5 4 3 2 1 0 -1 -2 -3 -4
y
[1] 2.449490 2.236068 2.000000 1.732051 1.414214 1.000000
[7] 0.000000 NA NA NA NA
多重套娃
a <- ifelse(value1, value1_if_true,
ifelse(value2, value2_if_true,
ifelse(value3, value3_if_true,
value_if_false)))
5. switch()函数
switch(EXPR, x1, x2, x3, …, xn ):数值EXPR为几,就返回x1到xn中的第几个。0<EXPR<=n,否则就会返回NULL[1]。
x <- switch(1,'missile', 'cancle', 'dissle')
x
[1] "missile"
x <- switch(4,'missile', 'cancle', 'dissle')
x
NULL
如果后面不是字符串而是变量,那么返回的值为该变量(该变量内所有值),而非返回该向量内的第几个元素(哪怕只有一个向量时)
y <- c('missile', 'cancle', 'dissle')
z <- c('pissile','bassle')
x <- switch(2,y,z)
x
[1] "pissile" "bassle"
y <- c('missile', 'cancle', 'dissle')
x <- switch(1,y)
x
[1] "missile" "cancle" "dissle"
字符串来说,其用法如下:
switch(condition.string,
case.str1=ret1,
case.str2=ret2,
case.str2=ret2,
…)
而最后返回的值为和condition.string匹配的case.str的ret的值
s <- "color"
switch(s, "color" = "red", "shape" = "square", "length" = 5)
[1] "red"
6. 循环语句:for、while、repeat
6.1 for
for (variable in vector) {
function
}
vector为向量或列表,variable依次变成vector中的值,然后对其进行操作。
function为要进行的操作。
(直接摘抄的)例子:
a <- double(5) #产生5个0
for (i in 1:length(a)) {
a[i] <- i^2
} #length(a)为5,令i依次取1到5,然后a的第i个元素a[i]被赋值为i^2
a
[1] 1 4 9 16 25
b <- list("Appale",1,FALSE) #b为列表
item <- character() # item为字符串变量
for (i in b) { # i依次取b中元素,
item <- c(item,mode(i)) #mode()为判断元素类别
} #利用mode()判断 i 的类别,新的item变量为旧item变量加上mode(i)
item.mode
[1] "character" "numeric" "logical"
始终要记住,R是一款newbeer的统计软件而非newbeer的编程软件。
利用向量化的操作比用循环对元素进行操作要更高效,且代码更加简洁。能用向量化的操作时应避免用循环操作。
以上代码用向量化操作可以写为:
b <- list("Appale",1,FALSE)
item.mode <- sapply(b,mode)#
sapply()函数:类似于lapply函数,但输入为列表,返回值为向量
sapply(X, FUN, …, )
X:列表、矩阵、数据框
FUN:自定义的调用函数
sapply(b, sum)# 求列表中各元素的和
sapply(b,mode)# 判断各元素类型
6.2 while
当条件cond满足时,重复执行表达式expr,直到条件cond不满足为止。
while (cond) {
expr
}
例子:
i <- 1
while (i < 6) {
print(i)
i = i + 1
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
6.3 repeat
repeat{}和rep()函数不同。
rep(x,times,length.out,each) 函数:将x重复times次,或者重复到length.out的长度
a <- 2:8
rep(a,times=2)
[1] 2 3 4 5 6 7 8 2 3 4 5 6 7 8
rep(a,length.out=2)#重复结果的长度为2
[1] 2 3
rep(a,each=2)#每个值重复两次
[1] 2 2 3 3 4 4 5 5 6 6 7 7 8 8
rep(a, each=3,length.out=10)
[1] 2 2 2 3 3 3 4 4 4 5
而repeat{}则是重复执行花括号内的命令
x <- 1
repeat {
print(x)
x <- x + 1
if (x == 6) {
break
}
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
7. 定义函数
形式如下:
FuncName <- function (arglist) {
expr
return(value)
}
argilist:参数列表,用, 隔开。
expr:要执行的命令。
return():给出返回结果,如果不写return语句,则将函数最后一个赋值语句作为返回值。如果不想返回任何对象,则可以将return的参数空缺,即写为return()。
当使用参数时,如果没有指定参数名,则按顺序赋值,如果指定了参数名,可以不按顺序赋值。对于已经指定了默认值的参数,可以在使用时不指定参数值。
#a is the girl ur found of ,then R'll tell u compared with another(b), she is prettier
prty <- function(a,b){
p1 <- paste(toupper(a),'is much prettier')
p2 <- 'illegal'
p3 <- 'empty'
pout <- ifelse(length(a)==1,p1,ifelse(length(a)>1,p2,p3))
return(pout)
}
prty('yifei liu', 'mi yang')
## [1] "YIFEI LIU is much prettier"
类似python,不再介绍。
8. R包
常用的R包:可参考 https://support.rstudio.com/hc/en-us/articles/201057987-Quick-list-of-useful-R-packages
按应用领域分类的R包,可参考 https://cran.r-project.org/web/views/
- 包的安装:用install.packages(“包的名字”)
- 包的加载:用library(包的名字)
- 从环境中移除包:detach(“package:包的名字”, unload=TRUE)
- 卸载包:remove.packages(“包的名字”)
9. 常用函数
9.1. 常用数学函数
函数 | 描述 |
---|---|
abs(x) | 绝对值 |
sqrt(x) | 开平方 |
ceiling(x) | 向上取整 |
floor(x) | 向下取整 |
trunc(x) | 0-x的整数部分 |
round(x,digits=n) | 舍入至n位小数 |
signif(x,digits=n) | 该数字一共n个数(整数+小数) |
cos(x) & sin(x) & tan(x) | 三角函数 |
acos(x) & asin(x) & atan(x) | 反三角函数 |
log(x,base=n) | 取以n为底,x的对数 |
log10(x) | 以10为底,x的对数 |
exp(x) | 指数函数:以e为底的指数 |
9.2. 统计函数
函数 | 描述 |
---|---|
mean(x) | 均值 |
media(x) | 中位数 |
sd(x) / var(x) | 标准差/方差 |
mad(x) | 绝对中位差 |
quantile(x, probs) | 分位数 |
range(x) | 全域 |
sum(x) | 求和 |
diff(x, lag=n) | 滞后n位的滞后差分…[1] |
min(x)/max(x) | 极值 |
scale(x, center=T, scale=T) | 中心化/标准化处理[2] |
cov(x) | 协方差 |
[1] : 滞后差分:
x<-c(1,5,23,29)
diff(x)
[ 1 ] 4,8,6
#后一个数字减去前一个数字
[2] : scale(x):标准化;scale(x,scale=F):中心化。
##9.3概率函数
概率函数分为4类:密度函数、分布函数、分位数函数、生成随机数。
根据不同的分布,又分为正态分布、均匀分布等等,二者组合成为具体的函数,在R中,前面4种类型用下面字母打头,之后的函数如下表所示:
d = 密度函数( density,y轴的值)
p = 分布函数( distribution function)
q = 分位数函数( quantile function)
r = 生成随机数(随机偏差Random error)
缩写 | 分布名称 |
---|---|
norm | 正态分布 |
t | t分布 |
chisq | 卡方分布 |
f | F分布 |
logis | 逻辑分布 |
singrank | wilcoxon符号秩和分布 |
wilcox | wilcoxon秩和分布 |
beta | Beta分布 |
binom | 二项分布 |
exp | 指数分布 |
geom | 几何分布 |
pois | 泊松分布 |
对数
其余详见下图
概率为0.95的N~(0,1)的分位数为1.64
qnorm(p=0.95,mean=0,sd=1)
[1] 1.644854
概率为0.99的N~(0,1)的分位数为1.64
qnorm(p=0.99, mean=0, sd=1)
[1] 2.326348
分位数为1.64的N~(0,1)的概率为0.95
pnorm(q = 1.64,0,1)
[1] 0.9494974
pnorm()和qnorm()之间的值可以互相转化
9.4. 工作空间函数
在R中,所有反斜杠\代表转义,工作路径用两个反斜杠或者正斜杠。
ls(all.names=TRUE): 得到包含隐藏变量(以点开头的变量)的列表。
.Last.value:得到上次运行的结果
search(): 查看已经载入的包。
library():查看已经安装的包。
data(dsname,package=“pkgname”):不载入某个包的情况下,使用该包的某个数据
9.5. 帮助函数
获取函数的帮助:?后接函数名,函数可不加括号,显示函数的帮助文档。
获取包的帮助:用命令help(package=“包的名字”)。
获取函数源代码:命令窗口中输入函数,不加括号并回车后
有时候这个函数可能是一个类函数(Generic Function),如plot函数,则先使用methods() 函数来查看这个类函数的列表,找到具体需要的函数如plot.default,使用?plot.default进行查看。
获取特殊符号的帮助,如[[,if,用help(“特殊符号”)
其他帮助命令见下图: