R语言笔记之语法篇
R语言的语法结构
R语言基础之语法
分支结构If...else...和 Ifelse()函数
Ifelse()函数是支持向量化计算的,ifelse(判断条件,为真的时候返回的变量,条件为假的时候返回的变量)。
举例 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47> (Brand=paste(c('Brand'),1:9,sep=''))
[1] "Brand1" "Brand2" "Brand3" "Brand4" "Brand5" "Brand6" "Brand7" "Brand8" "Brand9"
> (PName=paste(c('Dell'),1:9,sep=''))
[1] "Dell1" "Dell2" "Dell3" "Dell4" "Dell5" "Dell6" "Dell7" "Dell8" "Dell9"
> (Men=rep(c('1G','2G','4G'),times=3))
[1] "1G" "2G" "4G" "1G" "2G" "4G" "1G" "2G" "4G"
> (Feq=rep(c('2.2G','2.8G','3.3G'),each=3))
[1] "2.2G" "2.2G" "2.2G" "2.8G" "2.8G" "2.8G" "3.3G" "3.3G" "3.3G"
> (Price=rep(c(1000,2000,5000),3))
[1] 1000 2000 5000 1000 2000 5000 1000 2000 5000
> PC=data.frame(Brand,PName,Men,Feq,Price)
> #初始化,先为每个电脑都先打上Cheap标签
> PC$PD = rep('Cheap',9)
> for (i in 1:nrow(PC)){ #遍历PC数据框
+ if(PC[i,'Price']>3000){
+ #当价格大于3000的时候,就改成Expensive
+ PC[i,'PD']='Expensive'
+ }
+ }
> PC #从输出结果来看,每个品牌的电脑,都被标定了价格。
Brand PName Men Feq Price PD
1 Brand1 Dell1 1G 2.2G 1000 Cheap
2 Brand2 Dell2 2G 2.2G 2000 Cheap
3 Brand3 Dell3 4G 2.2G 5000 Expensive
4 Brand4 Dell4 1G 2.8G 1000 Cheap
5 Brand5 Dell5 2G 2.8G 2000 Cheap
6 Brand6 Dell6 4G 2.8G 5000 Expensive
7 Brand7 Dell7 1G 3.3G 1000 Cheap
8 Brand8 Dell8 2G 3.3G 2000 Cheap
9 Brand9 Dell9 4G 3.3G 5000 Expensive
> PC$PD2=ifelse(PC$Price>3000,'Expensive','Cheap') #用ifelse函数来实现相同的功能更方便
> PC
Brand PName Men Feq Price PD PD2
1 Brand1 Dell1 1G 2.2G 1000 Cheap Cheap
2 Brand2 Dell2 2G 2.2G 2000 Cheap Cheap
3 Brand3 Dell3 4G 2.2G 5000 Expensive Expensive
4 Brand4 Dell4 1G 2.8G 1000 Cheap Cheap
5 Brand5 Dell5 2G 2.8G 2000 Cheap Cheap
6 Brand6 Dell6 4G 2.8G 5000 Expensive Expensive
7 Brand7 Dell7 1G 3.3G 1000 Cheap Cheap
8 Brand8 Dell8 2G 3.3G 2000 Cheap Cheap
9 Brand9 Dell9 4G 3.3G 5000 Expensive Expensive
> PC$Price #PC$Prince是一个向量ifelse能完成向量化计算,对每一个元素作比较返回相应的值。
[1] 1000 2000 5000 1000 2000 5000 1000 2000 5000
for循环
从向量x中取出单个数据存到临时变量n当中,每取出一次,就执行一次循环体。
1 |
|
举例
1 |
|
while循环
condition为真的时候执行循环体
1 |
|
举例
1 |
|
repeat循环
repeat是死循环,只有用break来打断 1
2
3
4repeat{
> ...
>break
}
1 |
|
break、next
break是终止整个循环
next是终止当前的循环,不执行循环体中next后面的部分。
函数和包
1、函数
向量、因子、矩阵、数据框、数组、列表以及函数都是一类对象,可以随时创建,可以作为函数的参数。也就是说,R语言中的函数因为是一类对象,所以可以在函数中再创造函数,在C语言和C++等语言中函数就不是一类对象,必须提前编译。
1)、创建
在R语言中,没有return语句的时候,会把整个函数的最后一句作为返回语句。
1 |
|
举例子 1
2
3
4
5> myadd = function(a,b,c){
+ return (a+b+c)
+ }
> (a = myadd(1,2,3))
[1] 61
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23> mystat = function(x,na.omit=FALSE){
+ if (na.omit){
+ x=x[!is.na(x)] #是否忽略向量中的缺省值
+ }
+ m=mean(x)
+ n=length(x)
+ s=sd(x)
+ skew=sum((x-m)^3/s^3)/n
+ return (list(n=n,mean=m,stdev=s,skew=skew))
+ }
> x=rnorm(1000,100,10) #创建一个正太分布的随机向量,有1000个数,平均数是100,标准差是10
> mystat(x)
$n
[1] 1000
$mean
[1] 100.4087
$stdev
[1] 9.899276
$skew
[1] 0.03952049
2)、查看函数代码
- 不带括号的函数名
- 使用page函数,打开编辑器查看代码。
1 |
|
3)、导入.R文件
1 |
|
2、包的安装和加载
1)、包的安装
R语言中包的安装会自动解决依赖
使用R自带的编辑器安装包
- 第一步、程序包 ————> 设定CRAN镜像
- 第二步、程序包 ————> 安装程序包
使用命令安装
install.packages('abc')
2)、包的加载
安装包的时候需要用''将包的名称包裹,加载包的时候不需要。
Rstudio中使用命令加载包
1 |
|
Rstudio中,使用右下角的面板来加载包。
直接勾选就好。
向量化计算
1、普通的加减乘除
所谓向量化运算就是对向量中的每一个元素都进行运算处理
举例
1 |
|
向量化运算支持哪些运算:+-*/等四则运算 ><!=等逻辑运算
2、apply家族
- apply
- sapply lapply
- mapply tapply
1)、 apply(x,MARGIN=2,...)
apply(数组,维度,函数/函数名)
沿着数组的某一维度来处理数据,利用设置MARGIN的值来改变数据。MARGIN=2表示在列(域)的层面上处理数据
举例 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53> x=data.frame(pv=rnorm(100,20,3), #先生成一个有三个域的数据框
> + uv=rnorm(100,40,4),
> + ip=runif(100,40,50))
> apply(x,MARGIN = 2,mean) #MARGIN=1表示在行(记录)层面上处理数据,MARGIN=2表示在列(域)的层面上处理数据。处理方式是,mean,求均值。
pv uv ip
20.45526 39.81572 45.30480
#quantile是查看一组数据的百分位点,probs=c(0.1,0.5,0.9)设置想查看的百分位点
> apply(x,MARGIN = 2,quantile,probs=c(0.1,0.5,0.9))
pv uv ip
10% 16.90155 35.17513 41.02527
50% 20.09723 39.38737 45.19671
90% 24.70416 44.82648 49.37066
#可以看到pv、uv、ip在0.1、0.5、0.9处的百分位点
#数据降维
> (x=array(rnorm(2*3*4),c(2,3,4))) #生成一个三维的列表
, , 1
[,1] [,2] [,3]
[1,] -0.04255047 -1.407329 -0.9931210
[2,] -1.65621498 1.479997 0.5501781
, , 2
[,1] [,2] [,3]
[1,] -0.4668323 0.7451938 0.9585998
[2,] -0.4205612 0.3414420 -1.1822220
, , 3
[,1] [,2] [,3]
[1,] 0.596996 0.233922 0.03285836
[2,] -1.534795 1.598219 -1.89555578
, , 4
[,1] [,2] [,3]
[1,] 0.6793028 0.4429203 -0.605179
[2,] -0.4042032 -0.6241099 1.257368
> apply(x,c(1,2),mean) #将列表沿着3维的方向来处理数据,求均值。
[,1] [,2] [,3]
[1,] 0.191729 0.00367673 -0.1517105
[2,] -1.003944 0.69888709 -0.3175580
> apply(x,c(1,3),mean) #将列表沿着2维的方向来处理数据,求均值。
[,1] [,2] [,3] [,4]
[1,] -0.8143335 0.4123204 0.2879255 0.17234803
[2,] 0.1246534 -0.4204471 -0.6107106 0.07635149
> apply(x,c(2,3),mean) #将列表沿着1维的方向来处理数据,求均值。
[,1] [,2] [,3] [,4]
[1,] -0.84938273 -0.4436968 -0.4688996 0.13754980
[2,] 0.03633396 0.5433179 0.9160706 -0.09059479
[3,] -0.22147144 -0.1118111 -0.9313487 0.32609427
lapply总是返回一个列表
1 |
|
3)、sapply(列表,函数名/函数,其他参数)
sapply和lapply的差不多,但是sapply可以自动化简函数,
- 当结果列表长度为一的时候,返回向量。
- 当结果列表长度相同且大于一的时候返回矩阵。
- 当结果列表不等的时候仍然返回一个列表。
1 |
|
4)、mapply(列表,函数名/函数,其他参数)
mapply(函数/函数名,数据,函数相关的参数) ,mapply是apply的多元版本。
1 |
|
5)、tapply(向量,因子/因子列表,函数/函数名)
对向量的子集进行操作
1 |
|
3、split
- 根据因子或者因子列表将向量或者其他对象进行分组操作
- 通常与lappy一起使用
- spilt(向量/列表/数据框,因子/因子列表)
一般split函数是和lapply/sapply函数配合使用的,lapply(split(x,f),mean),将x先按照f分组,再使用mean函数求均值,最后以列表的形式输出。
1 |
|
排序
- sort:对向量进行排序,返回排好序的内容。
- order:返回排序好的内容的下标/多个排序标准。
1 |
|
数据处理流程
原始数据(raw dataset) ---> 预处理后的数据(clean dataset)
构建子集 subsetting
1、构建方法
- [] 提取一个或者多类型相同的元素 R语言中下标是从1开始的。
- [[]] 从列表或者数据框中提取数据
- $按照名字从列表或者数据框中提取元素
举例
1. 设置条件进行子集提取 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18> (x=c(rnorm(20,5,3)))
[1] -1.63156732 3.76807795 6.17118143 2.43515444 3.59313881 4.16966527 0.41943174 4.81982118 0.10841749
[10] 11.16069947 0.09089112 4.62378612 8.43299270 5.97803844 2.64061372 2.85256809 7.55771969 7.94601703
[19] 3.93132473 2.63224266
> x[x>5] #设置条件进行子集提取
[1] 6.171181 11.160699 8.432993 5.978038 7.557720 7.946017
> x>5 #直接输入x>5可以得到对向量中每个元素的大小的判断
[1] FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE TRUE FALSE FALSE TRUE TRUE FALSE
[20] FALSE
> (y=1:5)
[1] 1 2 3 4 5
> y[y<=2|y>=4]
[1] 1 2 4 5
> y[-3] #加负号代表将数据去除
[1] 1 2 4 5
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!